如何为继承多个接口的类设置DataTemplate

本文关键字:设置 DataTemplate 接口 继承 | 更新日期: 2023-09-27 18:03:29

我正在尝试使用MVVM架构和MEF,以便通过应用程序构建。我想使用DataTemplatesContentControls,以便允许我的应用程序以尽可能通用的方式显示给用户。

所以我现在为用户创建读/写信息和读/写结果到某个地方的能力,可以是XML,可以是数据库。所以我有两个接口IResultStorageITestStorage

我现在想为用户创建一个页面来更新这些设置,所以文件位置或数据库等。我的视图模型通过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来正确绘制它们。

希望这是有意义的,如果我做错了,这将是很好的知道。

如何为继承多个接口的类设置DataTemplate

对于更棘手的实现,让我们称之为更智能的实现我建议使用TemplateSelector

您将能够根据给定VM或业务对象的类型分配模板。您将面临的唯一挑战是,您必须找出对象以哪个"角色"传递给TemplateSelector

附加信息

我想这对你也有帮助。

您是否测试过您是否为每个资源创建了subdatatemplate ?

<DataTemplate DataType="{x:Type vm:TestStorage}">
    <Grid>
        <Label Content="{Binding someValueFromTestStorage}"/>
    </Grid>
</DataTemplate>

编辑

也许这两个链接可以帮助你第一,第二(ger)

这个链接也可能很有趣关注Beatriz Costa - MSFT (Partner)