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

4
我正在尝试使用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来正确地绘制它们。
希望这样说有意义,如果我完全错误了,那么知道这一点将是好的。

嗯,完全正确,两个“ContentControls”都包含“XmlStorage”。既然您没有为接口准备单独的模板,那么视图为什么要显示任何不同的内容呢? - DHN
@DHN,我为IResultStorage创建了一个模板,但它似乎没有生效。我记得你不能为接口创建DataTemplate,所以可能我想做的事情不可能实现,需要从这两个接口分别派生出两个单独的类来完成?我希望有一些巧妙的技巧可以解决这个问题。 - Firedragon
请参考我的帖子。 - DHN
2个回答

1

对于更为复杂的实现,我们称之为更智能的实现,我建议使用TemplateSelector。有关更多信息,请查看此处

您将能够根据给定VM或业务对象的类型分配模板。您将面临的唯一挑战是找出对象被传递到TemplateSelector中的哪个“角色”。

附加信息

我认为这里也会帮助您。


1

你是否尝试为每个资源创建子数据模板进行测试?

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

编辑

也许这两个链接可以帮助您 第一个, 第二个 (德语)

还有这个链接可能会很有趣,跟随Beatriz Costa - MSFT(合作伙伴)


由于TestStorage是一个属性而不是一个类型,所以您的建议不起作用。;o) - DHN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接