この記事は転載から
著者:Ryzen Adorer
前の記事:. NET Core 3 WPF MVVMフレームワークPrismシリーズのデータバインディング
原文へのリンク:https//www.cnblogs.com/ryzen/p/11905866.html
I.はじめにPrismのインストール
- パッケージ管理コンソールの使用方法
Install-Package Prism.Unity -Version 7.2.0.1367
または、NetWorker-Version 7.2.0.1367を削除して最新バージョンを取得することもできます。
- 管理ソリューションのNuGetパッケージを使用する

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

-
- unityはマイクロソフトの公式であり、prismのコンポーネント化をサポートしているため、prism.unityを使用することをお勧めします。公式ドキュメントではprism7はprism.Mefをサポートしておらず、Prism 7.1はprism.Autofacをサポートしません。
-
- 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に入れたくない場合や、プロジェクト名のルールが異なる場合は、他の方法を使用する必要があります。
- 命名ルールの変更
会社の命名規則が異常で、プロジェクトの構造が次のようになった場合(この会社は辞めてしまいます):

まず、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}";
- 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>());