将多个 Caliburn.Micro 视图模型绑定到同一视图的不同实例

Binding multiple Caliburn.Micro View Models to different instances of the same view

我正在使用 CM 和 WPF 进行一些数据展示,一些数据选项卡的格式非常相似,但作为应用程序标准的一部分,必须保存在包含选项卡的单独 VM 中。

我最初的想法是,我可以在 VM 中以编程方式执行此操作,方法是查找与 VM 对象(它本身是 Screen 对象派生)上的视图有关的任何 属性。它的直接超类用作[ImportMany] 的合同,以便父 VM 和 View 可以将集合制成表格。

[ImportingConstructor]
    public PartiesMasterPartiesViewModel(
          IEventAggregator events, 
          IHelpService help, 
          ResourceManager<B_Action> actionResource, 
          IActionService actionService)
        : base( events,  help, actionResource, actionService)
    {
    }
    protected override void OnActivate()
    {
        base.OnActivate();
        this.Views.Add(new KeyValuePair<object, object>(this, 
           new PartiesMasterListView()));
    }

所以要么我没有正确使用这个 属性,要么它没有按照我的想法工作,我需要使用其他方式。

我正在考虑的另一种方法是显式实例化同一视图模型的多个实例并手动将它们添加到集合中,但这似乎违反了 MEF [ImportMany] 的规定做和弱化应用程序的设计。

实现多个视图模型共享视图的最简单方法是使用一些额外的规则配置ViewLocator

在此示例中,我有两个视图模型 Examples.ViewModels.SharedData1ViewModelExamples.ViewModels.SharedData1ViewModel 以及一个视图 Examples.Views.SharedDataView,我希望它成为 Caliburn.Micro 定位的视图默认情况下都是。

在我的设置代码中,我可以将以下简单的正则表达式添加到 ViewLocator

ViewLocator.NameTransformer.AddRule(
    @"^Examples.ViewModels\.SharedData(\d+)ViewModel",
    @"Examples.Views.SharedDataView");