如何为继承多个接口的类设置DataTemplate
本文关键字:设置 DataTemplate 接口 继承 | 更新日期: 2023-09-27 18:03:29
我正在尝试使用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
被绘制时,ContentControls
都是XmlStorage
类型的,所以我不知道如何创建DataTemplates
来正确绘制它们。
希望这是有意义的,如果我做错了,这将是很好的知道。
对于更棘手的实现,让我们称之为更智能的实现我建议使用TemplateSelector
。
您将能够根据给定VM或业务对象的类型分配模板。您将面临的唯一挑战是,您必须找出对象以哪个"角色"传递给TemplateSelector
。
附加信息
我想这对你也有帮助。
您是否测试过您是否为每个资源创建了subdatatemplate ?
<DataTemplate DataType="{x:Type vm:TestStorage}">
<Grid>
<Label Content="{Binding someValueFromTestStorage}"/>
</Grid>
</DataTemplate>
编辑
也许这两个链接可以帮助你第一,第二(ger)
这个链接也可能很有趣关注Beatriz Costa - MSFT (Partner)