我试图使用MVVM架构和MEF来按应用程序构建.我想使用DataTemplates和ContentControls以允许我的应用程序以尽可能通用的方式显示给用户.
所以我现在正在为用户创建读/写信息和读/写结果的能力,可能是XML,可能是数据库.所以我有两个接口IResultStorage和ITestStorage
我现在想要为用户创建一个页面来更新这些页面的设置,因此文件位置或数据库等等.我的视图模型通过MEF导入它们:
public sealed class AdminViewModel : ViewModelBase
{
[Import]
public ITestStorage TestStorage { get; set; }
[Import]
public IResultStorage ResultStorage { get; set; }
}
然后在运行时导出视图并将其加载到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被绘制时,两个ContentControl都是XmlStorage类型,所以我似乎不知道如何创建DataTemplates来正确绘制它们.
希望这是有道理的,如果我完全以错误的方式完成它将会很有用.
最佳答案 那么对于一个更棘手的实现,让我们称之为更智能的实现我会建议一个TemplateSelector.欲了解更多信息,请查看
here.
您将能够根据给定VM或业务对象的类型分配模板.您将面临的唯一挑战是您必须找出对象传递给TemplateSelector的“角色”.
附加信息
我认为this也会对你有所帮助.