4

我正在尝试使用 MVVM 架构和 MEF 来构建应用程序。我想使用DataTemplatesandContentControls以允许我的应用程序以尽可能通用的方式向用户显示。

所以我现在正在为用户创建读取/写入信息和读取/写入结果到某个地方的能力,可以是 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以正确绘制它们。

希望这是有道理的,如果我以完全错误的方式完成它,那将是一件好事。

4

2 回答 2

1

如果您为每个作为资源创建子数据模板,您是否测试过?

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

编辑

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

这个链接也可能很有趣,关注Beatriz Costa - MSFT(合作伙伴)

于 2013-03-11T13:24:21.297 回答
1

好吧,对于更棘手的实现,让我们称之为更智能的实现,我建议使用TemplateSelector. 欲了解更多信息,请看这里

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

附加信息

我想也会对你有所帮助。

于 2013-03-11T09:07:46.537 回答