c# – 如何为继承多个接口的类设置DataTemplate?

我试图使用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也会对你有所帮助.

点赞