(1/7). NET Core 3 WPF MVVMフレームワークPrismファミリのデータバインディング

(1/7). NET Core 3 WPF MVVMフレームワークPrismファミリのデータバインディング

データバインド

最后更新 2023/06/10 23:30
RyzenAdorer
预计阅读 4 分钟
分类
WPF
专题
WPF MVVMフレームワークPrismシリーズ
标签
.NET C# WPF Prism MVVM

この記事は転載から

著者:Ryzen Adorer

前の記事:. NET Core 3 WPF MVVMフレームワークPrismシリーズのデータバインディング

原文へのリンク:https//www.cnblogs.com/ryzen/p/11905866.html

I.はじめにPrismのインストール

  1. パッケージ管理コンソールの使用方法
Install-Package Prism.Unity -Version 7.2.0.1367

または、NetWorker-Version 7.2.0.1367を削除して最新バージョンを取得することもできます。

  1. 管理ソリューションのNuGetパッケージを使用する

疑問があるかもしれません。PrismのインストールがPrism.Unityと関係がある理由は、UnityがIOCコンテナであり、Prism自体がIOCをサポートしており、現在いくつかのIOCコンテナが公式にサポートされています。

    1. unityはマイクロソフトの公式であり、prismのコンポーネント化をサポートしているため、prism.unityを使用することをお勧めします。公式ドキュメントではprism7はprism.Mefをサポートしておらず、Prism 7.1はprism.Autofacをサポートしません。
    1. prism.unityをインストールすると、すべてのprismコアライブラリが含まれます。

II.はじめにデータバインドの実装

ViewsフォルダとViewModelsフォルダを作成し、Viewsフォルダの下にMainWindowを配置し、ViewModelsフォルダの下にMainWindowViewModelクラスを作成します。

Xamlコードは以下の通り。

<Window
  x:Class="PrismSample.Views.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:prism="http://prismlibrary.com/"
  xmlns:local="clr-namespace:PrismSample"
  mc:Ignorable="d"
  Title="MainWindow"
  Height="450"
  Width="800"
  prism:ViewModelLocator.AutoWireViewModel="True"
>
  <StackPanel>
    <TextBox
      Text="{Binding Text}"
      Margin="10"
      Height="100"
      FontSize="50"
      Foreground="Black"
      BorderBrush="Black"
    />
    <button
      Height="100"
      Width="300"
      Content="Click Me"
      FontSize="50"
      Command="{Binding ClickCommnd}"
    />
  </StackPanel>
</Window>

ViewModelのコードは次のとおりです。

using Prism.Commands;
using Prism.Mvvm;

namespace PrismSample.ViewModels
{
   public class MainWindowViewModel:BindableBase
    {
        private string _text;
        public string Text
        {
            get { return _text; }
            set { SetProperty(ref _text, value); }
        }

        private DelegateCommand _clickCommnd;
        public DelegateCommand ClickCommnd =>
            _clickCommnd ?? (_clickCommnd = new DelegateCommand(ExecuteClickCommnd));

        void ExecuteClickCommnd()
        {
            this.Text = "Click Me!";
        }

        public MainWindowViewModel()
        {
            this.Text = "Hello Prism!";
        }
    }
}

プログラムの開始:

ボタンをクリックしてください。

ご覧の通り、prismでデータバインディングを実装し、ViewとViewModelの完全なフロントとリアの分離に成功しました。

しかし、ここで別の質問があります。Prismに従ってViewとViewModelをViewsとViewModelsに入れたくない場合や、プロジェクト名のルールが異なる場合は、他の方法を使用する必要があります。

  1. 命名ルールの変更

会社の命名規則が異常で、プロジェクトの構造が次のようになった場合(この会社は辞めてしまいます):

まず、Appにprismをし、Applicationをprism mApplicationに変更し、StartupUriを削除する必要がある。

Xamlコードは以下の通り。

<prism:PrismApplication
  x:Class="PrismSample.App"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:prism="http://prismlibrary.com/"
  xmlns:local="clr-namespace:PrismSample"
>
  <Application.Resources> </Application.Resources>
</prism:PrismApplication>

csバックグラウンドコードは以下の通りです。

using Prism.Unity;
using Prism.Ioc;
using Prism.Mvvm;
using System.Windows;
using PrismSample.Viewsb;
using System;
using System.Reflection;

namespace PrismSample
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        //设置启动起始页
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {

        }

        //配置规则
        protected override void ConfigureViewModelLocator()
        {
            base.ConfigureViewModelLocator();
            ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
            {
                var viewName = viewType.FullName.Replace(".Viewsb.", ".ViewModelsa.OhMyGod.");
                var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;
                var viewModelName = $"{viewName}Test, {viewAssemblyName}";
                return Type.GetType(viewModelName);
            });
        }
    }
}

この二つの言葉が重要です。

“. Viewsb.“Viewが存在するフォルダnamespaceを表します。”. ViewModelsa.OhMyGod. ViewModelが存在するnamespaceを示す

var viewName = viewType.FullName.Replace(".Viewsb.", ".ViewModelsa.OhMyGod.");

TestはViewModel接尾辞を示す

var viewModelName = $"{viewName}Test, {viewAssemblyName}";
  1. ViewModelの登録をカスタマイズ

カスタムクラスとして新しいFooクラスを作成します。

using Prism.Commands;
using Prism.Mvvm;

namespace PrismSample
{
   public class Foo:BindableBase
    {

        private string _text;
        public string Text
        {
            get { return _text; }
            set { SetProperty(ref _text, value); }
        }

        public Foo()
        {
            this.Text = "Foo";
        }

        private DelegateCommand _clickCommnd;
        public DelegateCommand ClickCommnd =>
            _clickCommnd ?? (_clickCommnd = new DelegateCommand(ExecuteClickCommnd));

        void ExecuteClickCommnd()
        {
            this.Text = "Oh My God!";
        }
    }
}

App.コードの変更

protected override void ConfigureViewModelLocator()
{
    base.ConfigureViewModelLocator();
    ViewModelLocationProvider.Register<MainWindow, Foo>();
    //ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
    //{
    //    var viewName = viewType.FullName.Replace(".Viewsb.", ".ViewModelsa.OhMyGod.");
    //    var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;
    //    var viewModelName = $"{viewName}Test, {viewAssemblyName}";
    //    return Type.GetType(viewModelName);
    //});
}

操作する:

ボタンをクリック:

命名規則を変更するコードにコメントを付けなくても、実行結果は同じであることがわかり、結論が得られます。

この直接的で反射的な登録なしのカスタム登録方法は優先度が高く、公式文書では効率が高いことが示されています。

公式には4つの方法があり、残りの3つの登録方法は次のとおりです。

ViewModelLocationProvider.Register(typeof(MainWindow).ToString(), typeof(MainWindowTest));
ViewModelLocationProvider.Register(typeof(MainWindow).ToString(), () => Container.Resolve<Foo>());
ViewModelLocationProvider.Register<MainWindow>(() => Container.Resolve<Foo>());
Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2023/06/11

7/7

NET Core3環境でMVVMフレームワークPrismのダイアログサービスを使用する方法は、prismシリーズの最後の記事です。

继续阅读
同分类 / 同标签 2023/06/11

6/7

NET Core3でMVVMフレームワークを使用する方法Prism地域ベースのナビゲーションシステム

继续阅读
同分类 / 同标签 2023/06/11

5/7

NET Core3環境でMVVMフレームワークを使用する方法Prismのゾーンマネージャを使用したビューの管理

继续阅读