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

时间:2013-03-11 08:35:40

标签: c# wpf xaml data-binding

我正在尝试使用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的{​​{1}}类型都是XmlStorage,所以我不知道如何创建DataTemplates来正确绘制它们。< / p>

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

2 个答案:

答案 0 :(得分:1)

对于更多棘手的实现,让我们称之为更智能的实现我建议TemplateSelector。有关详细信息,请查看here

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

其他信息

我认为this也会对你有帮助。

答案 1 :(得分:1)

你是否试过为每个人创建subDatatemplate作为Resourse?

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

修改

也许这2个链接可以帮助您FirstSecond (ger)

这个link也可能很有趣跟随 Beatriz Costa - MSFT(合作伙伴)