我正在尝试使用 MVVM 架构和 MEF 以便按应用程序构建。我想使用 DataTemplates
和 ContentControls
以允许我的应用程序以尽可能通用的方式向用户显示。
所以我现在正在为用户创建读/写信息和读/写结果到某个地方的能力,可以是 XML,可以是数据库。所以我有两个接口(interface) IResultStorage
和 ITestStorage
我现在想为用户创建一个页面来更新这些设置,例如文件位置或数据库等。我的 View 模型通过 MEF 导入它们:
public sealed class AdminViewModel : ViewModelBase
{
[Import]
public ITestStorage TestStorage { get; set; }
[Import]
public IResultStorage ResultStorage { get; set; }
}
然后 View 被导出并在运行时加载到Resources.MergedDictionaries
<DataTemplate DataType="{x:Type vm:AdminViewModel}">
<Grid>
<TabControl Grid.Row="0">
<TabItem Header="Tests">
<ContentControl Grid.Row="0" Content="{Binding TestStorage}"/>
</TabItem>
<TabItem Header="Results">
<ContentControl Grid.Row="0" Content="{Binding ResultStorage}"/>
</TabItem>
</TabControl>
</Grid>
</DataTemplate>
但是,我目前实现它的方式是一个类继承了这两个,这就是给我带来问题的原因:
[Export(typeof(ITestStorage))]
[Export(typeof(IResultStorage))]
public sealed class XmlStorage : ITestStorage, IResultStorage { ... }
所以当上面的 AdminViewModel
被绘制时,两个 ContentControls
都是 XmlStorage
类型,所以我不知道如何创建 DataTemplates
以正确绘制它们。
希望这是有道理的,如果我以完全错误的方式完成它,那将是一件好事。
最佳答案
好吧,对于更棘手的实现,让我们称它为更智能的实现,我建议使用TemplateSelector
。更多信息请看here .
您将能够根据给定 VM 或业务对象的类型分配模板。您将面临的唯一挑战是,您必须找出将对象传递给 TemplateSelector
的“角色”。
附加信息
我认为this也会帮助你。
关于c# - 继承多个接口(interface)的类如何设置DataTemplate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15334164/