我正在使用 CM 和 WPF 进行一些数据演示,一些数据选项卡具有非常相似的格式,但必须保存在包含选项卡的单独虚拟机中,作为应用程序标准的一部分。
我最初的想法是,我可以在 VM 中以编程方式执行此操作,方法是查找与 VM 对象上的 View 相关的任何属性(它本身是 Screen 对象派生)。它的直接父类(super class)用作 的契约[ImportMany]
以便父虚拟机和 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()));
}
所以,要么我没有正确使用这个属性,要么它没有按照我的想法做,我需要使用另一种方式。
我正在考虑的另一种方法是显式实例化同一 View 模型的多个实例并手动将它们添加到集合中,但这似乎违反了 MEF 的 [ImportMany]
的规定来这里是为了削弱应用程序的设计。
最佳答案
实现多个 View 模型共享 View 的最简单方法是使用一些额外的规则配置 ViewLocator
。
在此示例中,我有两个 View 模型 Examples.ViewModels.SharedData1ViewModel
和 Examples.ViewModels.SharedData1ViewModel
以及一个 View Examples.Views.SharedDataView
code> 我希望成为 Caliburn.Micro 默认为两者定位的 View 。
在我的设置代码中,我可以将以下简单的正则表达式添加到ViewLocator
。
ViewLocator.NameTransformer.AddRule(
@"^Examples.ViewModels\.SharedData(\d+)ViewModel",
@"Examples.Views.SharedDataView");
关于c# - 将多个 Caliburn.Micro View 模型绑定(bind)到同一 View 的不同实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28508254/