Prism视图模型定位器(ViewModelLocator)

发布时间 2023-09-03 11:41:47作者: ZHIZRL

视图模型定位器(ViewModelLocator) 依照“标准命名约定”将 视图(View) 中的数据上下文链接到 视图模型(ViewModel) 的实例。

自动绑定视图模型

Prism 视图模型定位器 (ViewModelLocator) 有一个 AutoWireViewModel 属性:当设置为 true 时, AutoWireViewModelChanged 事件调用类中的 ViewModelLocationProvider 方法来解析视图的 ViewModel,然后将视图的数据上下文设置为该ViewModel 的实例。默认情况下,此行为处于启用状态:如果您不希望将其用于视图,则需要设置为 False 。使用以下 AutoWireViewModel 附加属性。将值设置 False 为选择退出和 True 明确选择加入。

<Window x:Class="Demo.Views.MainWindow"
...
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True">

标准命名约定规则如下:
ViewModel 与视图类型在同一个程序集中
ViewModel 位于 .ViewModels 子命名空间中
View位于 .Views 子命名空间中
ViewModel 名称与视图名称对应,并以“ViewModel”结尾。 

程序运行如下所示:

更改标准命名约定

如果您的应用程序不遵循 ViewModelLocator 默认命名约定,您可以更改约定以满足您的应用程序的要求。该类 ViewModelLocationProvider 提供了一个名为的静态方法 SetDefaultViewTypeToViewModelTypeResolver ,可用于提供您自己的将视图关联到视图模型的约定。要更改 ViewModelLocator 命名约定,请覆盖类 ConfigureViewModelLocator 中的方法 App.xaml.cs 。然后在方法中提供您的自定义命名约定逻辑 ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver 。

protected override void ConfigureViewModelLocator()
{
base.ConfigureViewModelLocator();
ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
{
var viewName = viewType.FullName.Replace(".ViewModels.", ".CustomNamespace.");
var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;
var viewModelName = $"{viewName}ViewModel, {viewAssemblyName}";
return Type.GetType(viewModelName);
});
}

自定义 ViewModel 注册

在某些情况下,您的应用程序可能遵循 ViewModelLocator 默认命名约定,但您有许多不遵循约定的 ViewModel。 ViewModelLocator 无需尝试自定义命名约定逻辑以有条件地满足您的所有命名要求,您可以使用方法直接将 ViewModel 映射到特定视图 ViewModelLocationProvider.Register 。MainWindow 以下示例显示了在名为 的视图和名为 的 ViewModel 之间创建映射的各种方法 CustomViewModel 。 

类型/类型 

ViewModelLocationProvider.Register(typeof(MainWindow).ToString(), typeof(CustomViewModel));

类型/工厂

ViewModelLocationProvider.Register(typeof(MainWindow).ToString(), () => Container.Resolve<CustomViewModel>());

通用工厂 

ViewModelLocationProvider.Register<MainWindow>(() => Container.Resolve<CustomViewModel>());

通用类型

ViewModelLocationProvider.Register<MainWindow, CustomViewModel>();