TabControl 中具有 MahApps.Metro 的多个视图模型

Multiple view models with MahApps.Metro within TabControl

我正在尝试让 TabControl 显示来自两个不同 categories/viewmodels 的保存数据。基于这两个资源,WPF MahApps.Metro Tabcontrol data bound? and DataTemplates aren't applied,我尝试了以下方法,但它并没有成功,因为它给出了编译错误。

<TabControl ItemsSource="{Binding Collection}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Title}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate DataType="{x:Type viewModels:SubViewModelAlpha}">
            <TextBlock>SubViewModelAlpha</TextBlock>
        </DataTemplate>
        <DataTemplate DataType="{x:Type viewModels:SubViewModelBeta}">
            <TextBlock>SubViewModelBeta</TextBlock>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

我有对应的类:

public class ViewModel { 
   public string Title { get; set; }
}

public class SubViewModelAlpha : ViewModel { }
public class SubViewModelBeta : ViewModel { }

// In another class, I have this property ... 
public ObservableColletion<ViewModel> Collection {
   get { return _collection; } 
}
// ... and this list
private ObservableColletion<ViewModel> _collection;

我得到的错误是 "Property ContentTemplate is set more than once",这是有道理的,但是我如何在设置 ContentTemplate 之前对一种 ViewModel 应用相同类型的检查?

我已经尝试在 ContentTemplate 上使用 DataType,但这不起作用。

PS!我当然想要每个视图模型中的更多数据,但是这个例子展示了我想要实现的目标的要点。

我认为这里的问题是它自己的内容模板只接受一个模板 , 就像你为单个 window 添加两个网格时它会告诉你内容 属性 不能设置多次

从基本的角度来看,我在这里想到的是,您可以做一个结合了两个模板的单一模板,并通过触发器和转换器在它们之间进行选择

编辑

查看这篇文章 http://tech.pro/tutorial/807/wpf-tutorial-how-to-use-a-datatemplateselector

阅读更多内容后,似乎可以使用 ContentTemplateSelector 解决问题,尽管我不确定是否存在任何奇怪的依赖关系。

我将 xaml 更改为:

<TabControl ItemsSource="{Binding Collection}"
            ContentTemplateSelector="{DynamicResource MyContentTemplateSelector}">
    <TabControl.Resource>
        <DataTemplate x:Key="BetaTemplate" DataType="{x:Type viewModels:SubViewModelAlpha}">
            <TextBlock>SubViewModelAlpha</TextBlock>
        </DataTemplate>
        <DataTemplate x:Key="BetaTemplate" DataType="{x:Type viewModels:SubViewModelBeta}">
            <TextBlock>SubViewModelBeta</TextBlock>
        </DataTemplate>
        <viewModels:MyContentTemplateSelector
            x:Key="MyContentTemplateSelector" 
            AlphaTemplate="{StaticResource AlphaTemplate}"
            BetaTemplate="{StaticResource BetaTemplate}" />
    <TabControl.Resource>
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Title}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>

将以下 class 添加到我的项目中:

public class MyContentTemplateSelector : DataTemplateSelector
{
    public DataTemplate AlphaTemplate { get; set; }
    public DataTemplate BetaTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is SubViewModelAlpha) 
            return AlphaTemplate;

        if (item is SubViewModelBeta)
            return BetaTemplate;

        return base.SelectTemplate(item, container);
    }
}

此代码大致基于 Using ContentTemplateSelector,我不确定其中有哪些注意事项(如果有的话)。

不过,我确实相信可以使用直接使用数据类型的更好的解决方案,但我不知道如何实现!然而...