15. 视图管理器 The ViewManager
ViewManager 是 Stylet 的核心组件之一,负责获取 ViewModel 并为其定位正确的 View。然后实例化该 View,并将其绑定到 ViewModel。
本文将教您这个过程是如何工作的,以及如何修改它。
定位视图
默认的视图定位策略非常简单:在 ViewModel 的类型和命名空间中将字符串“ViewModel”替换为字符串“View”,然后在所有已配置的程序集中搜索具有该名称的类型。
就是这样。
“配置的程序集”是指 ViewManager 的 ViewAssemblies 属性中的所有程序集。如果您想搜索更多程序集,请将它们添加到此列表中(请参阅下面的示例)。
此过程由 ViewManager.LocateViewForModel 控制,因此如果您想修改它,请继续进行子类化ViewManager
- 请参阅本文底部的部分。
创建视图
一旦确定了视图类型,就会通过调用提供给 ViewManager 的工厂方法对其进行实例化。默认情况下,引导程序将其设置为调用您的 IoC 容器。InitializeComponent
然后调用,这意味着您可以根据需要删除代码隐藏。
ViewManager.CreateViewForModel
如果您想覆盖它,则由 处理。
将视图绑定到它的 ViewModel
绑定 ViewModel 及其对应的 View 非常简单:
- View 的 DataContext 设置为 ViewModel。
- View 的 ActionTarget 设置为 ViewModel(请参阅Actions)。
- 如果 ViewModel 实现了
IViewAware
,它的AttachView
方法被调用,并且 View 被传递(参见Screens and Conductors)。
处理View.Model
变化
ViewManager 还负责对附加属性的更改做出反应ContentControl
-View.Model
请参阅ViewModel First。
它将获取附加属性的新值(应该绑定到 ViewModel 实例),并在将其设置为 的内容之前使用CreateViewForModel
并BindViewToModel
创建新配置的 View 实例ContentControl
。
配置视图管理器
ViewManager 是可配置的。要配置它,请在您的Configure
方法中获取它的一个实例:
protected override void Configure()
{
var viewManager = this.Container.Get<ViewManager>();
// ...
}
一旦你得到它,你可以在上面配置几件事:
ViewSuffix
:您的视图类名称的后缀。默认为“查看”。ViewModelSuffix
:您的视图类名称的后缀。默认为“ViewModel”。ViewAssemblies
:要扫描哪些程序集以获取视图。默认为包含引导程序的程序集。NamespaceTransformations
:这是一个替换字典from -> to
,允许您的视图和视图模型存在于不同的命名空间中。如果您的视图位于“Foo.Frontend.Views”中而您的 ViewModel 位于“Foo.FrontendLogic.ViewModels”中,您可以使用键“Foo.Frontend”和值“Foo.FrontendLogic”向该字典添加一个条目。请注意,您必须包括所有根命名空间:您不能在此处使用从“Frontend”到“FrontendLogic”的转换。
创建自己的 ViewManager
当 Stylet 需要 ViewManager 时,它会IViewManager
从 IoC 容器中检索一个实例。这意味着您可以创建所需的 IViewManager 实现并将其注册到 IoC 容器,Stylet 将获取并使用它。
一个非常简单的例子:
// CustomViewManager.cs
public class CustomViewManager : ViewManager
{
public CustomViewManager(ViewManagerConfig config)
: base(config)
{
}
public override UIElement CreateAndSetupViewForModel(object model)
{
// 这个虚拟应用程序只有一个视图,就是这个 :)
return new SingletonView();
}
}
// Bootstrapper.cs
public class Bootstrapper : Bootstrapper<MyRootViewModel>
{
protected override void ConfigureIoC(IStyletIoCBuilder builder)
{
builder.Bind<IViewManager>().To<CustomViewManager>();
}
}
可以在Stylet.Samples.OverridingViewManager
sample中找到更完整的示例。
项目原地址:https://github.com/canton7/Stylet
当前文档原地址:https://github.com/canton7/Stylet/wiki/The-ViewManager
上一篇:WPF的MVVM框架Stylet开发文档 14.StyletIoC
下一篇:WPF的MVVM框架Stylet开发文档 16.监听INotifyPropertyChanged接口