我正在尝试使用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
的{{1}}类型都是XmlStorage
,所以我不知道如何创建DataTemplates
来正确绘制它们。< / p>
希望这是有道理的,如果我完全以错误的方式完成它,那将是很好的。
答案 0 :(得分:1)
对于更多棘手的实现,让我们称之为更智能的实现我建议TemplateSelector
。有关详细信息,请查看here。
您将能够根据给定VM或业务对象的类型分配模板。您将面临的唯一挑战是您必须找出对象传递给TemplateSelector
的“角色”。
其他信息
我认为this也会对你有帮助。
答案 1 :(得分:1)
你是否试过为每个人创建subDatatemplate作为Resourse?
<DataTemplate DataType="{x:Type vm:TestStorage}">
<Grid>
<Label Content="{Binding someValueFromTestStorage}"/>
</Grid>
</DataTemplate>
修改
也许这2个链接可以帮助您First,Second (ger)
这个link也可能很有趣跟随 Beatriz Costa - MSFT(合作伙伴)