WPF的MVVM框架Stylet开发文档 15. 视图管理器 The ViewManager

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 实例),并在将其设置为 的内容之前使用CreateViewForModelBindViewToModel创建新配置的 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接口

猜你喜欢

转载自blog.csdn.net/qq_39427511/article/details/130280058
今日推荐