2015-06-26 20 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