c# - 继承多个接口(interface)的类如何设置DataTemplate?

标签 c# wpf xaml data-binding

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

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

我现在想为用户创建一个页面来更新这些设置,例如文件位置或数据库等。我的 View 模型通过 MEF 导入它们:

public sealed class AdminViewModel : ViewModelBase
{
    [Import]
    public ITestStorage TestStorage { get; set; }

    [Import]
    public IResultStorage ResultStorage { get; set; }
}

然后 View 被导出并在运行时加载到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 以正确绘制它们。

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

最佳答案

好吧,对于更棘手的实现,让我们称它为更智能的实现,我建议使用TemplateSelector。更多信息请看here .

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

附加信息

我认为this也会帮助你。

关于c# - 继承多个接口(interface)的类如何设置DataTemplate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15334164/

相关文章:

c# - 在 C# 中格式化 double 值

c# - 更改 Designer.cs 文件是否安全?

.net - 更改背景不透明度而不更改内容不透明度

wpf - WPF中通过Uid获取对象

c# - OnBackButtonPressed 不触发 Xamarin 表单

c# - 需要在不知道对象是什么类型的情况下转换为对象

c# - 如何将 EDMX 嵌入 Code First 程序集中?

c# - 简单的嵌套 TreeView Xaml 结构?

UWP 控件的 XAML 命名空间标识符

c# - 如何右对齐 WPF ListItem 的某些元素?