我正在尝试使用MVVM架构和MEF来构建我的应用程序。我想使用DataTemplates和ContentControls,以尽可能通用的方式向用户显示应用程序。
因此,我现在正在创建用户读取/编写信息和读取/编写结果的能力,可以是XML,也可以是数据库。所以我有两个接口IResultStorage和ITestStorage。
现在,我想为用户创建一个页面,以更新这些设置,例如文件位置或数据库等。我的视图模型通过MEF导入它们:
当上面的
希望这样说有意义,如果我完全错误了,那么知道这一点将是好的。
因此,我现在正在创建用户读取/编写信息和读取/编写结果的能力,可以是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
来正确地绘制它们。希望这样说有意义,如果我完全错误了,那么知道这一点将是好的。
IResultStorage
创建了一个模板,但它似乎没有生效。我记得你不能为接口创建DataTemplate
,所以可能我想做的事情不可能实现,需要从这两个接口分别派生出两个单独的类来完成?我希望有一些巧妙的技巧可以解决这个问题。 - Firedragon