2015-06-26 22 views
1

我试图让TabControl显示来自两个不同类别/ viewmodels的持有数据。基于这两个资源,WPF MahApps.Metro Tabcontrol data bound?DataTemplates aren't applied,我尝试了下面的方法,因为它给出了一个编译错误,所以不能完全切割。TabControl中的MahApps.Metro多视图模型

<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; 

我得到的错误是“属性的ContentTemplate设置不止一次”,哪一种是有意义的,但我怎么可以将相同类型的在设置ContentTemplate之前检查一种ViewModel?

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

PS!我当然需要在每个视图模型中有更多的数据,但是这个例子显示了我想要实现的内容的要点。

回答

1

阅读更多内容后,似乎可以使用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> 

与添加到我的项目下面的类:

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,我不知道是什么如果有的话,有一些警告。

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

1

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

什么我可以从一个基本的前瞻性想到这里是你可以通过触发器和转换器

编辑

检查这篇文章做结合了模板一个模板,选择它们之间 http://tech.pro/tutorial/807/wpf-tutorial-how-to-use-a-datatemplateselector

+0

我知道了,这就是为什么我问如何根据物品来源的类型区分 – holroy

+0

我更新了答案 – bigworld12

+0

如何?那个tenplate需要引用两个不同的viewModels? – holroy