2015-04-19 142 views
3

我已經搜索了很多SO,並沒有找到我的問題的答案。 我想使用TabControl和MVVM。這裏是我加的TabControl爲MainWindow.xamlWPF與ContentControl的TabControl

<Window.Resources> 
     <DataTemplate DataType="{x:Type models:PartnersViewModel}"> 
      <views:PartnersView /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type models:ProjectsViewModel}"> 
      <views:ProjectsView /> 
     </DataTemplate> 
    </Window.Resources> 

    <Window.DataContext> 
     <models:ApplicationViewModel/> 
    </Window.DataContext> 

    <TabControl ItemsSource="{Binding PageViewModels}" TabStripPlacement="Left"> 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}" /> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 
     <TabControl.ContentTemplate> 
      <DataTemplate> 
       <ContentControl Content="{Binding}" /> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
    </TabControl> 

PageViewModels是ObservableCollection<IPageViewModel>IPageViewModel是一個簡單的界面與一個屬性Name。這個接口有兩個實現PartnersViewModelProjectsViewModel

public class ProjectsViewModel : IPageViewModel 
{ 
    public String Name 
    { 
     get { return "Projects"; } 
    } 
} 

public class PartnersViewModel : IPageViewModel 
{ 
    public String Name 
    { 
     get { return "Partners"; } 
    } 
} 

我希望每個選項卡都顯示爲ContentControl。標題文本取自「名稱」屬性。我ProjectsView和PartnersView看起來是這樣的:

<UserControl x:Class="WANIRPartners.Views.ProjectsView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" > 
    <Grid> 
    <Label Content="Projects Content" /> 
    </Grid> 
</UserControl> 

TabControl使用此代碼,標題和內容是完全一樣的。 「項目內容」/「合作伙伴內容」顯示在選項卡標題中,並且(在標籤內容中也是這樣)。當我將<Label/>更改爲<DataGrid/>選項卡標題包含數據網格(原文!)。 我如何才能正常工作。我的意思是,如何根據PageViewModels中的內容將標題顯示爲屬性Name的值以及正確呈現<views:PartnersView /><views:ProjectsView />的標籤內容。

+0

我是否正確理解它是通過'DataType'選擇正確的'DataTemplate',但它忽略了'ItemTemplate'的頭部? 'TabControl'是否有默認模板? – dkozl

+0

看來你是對的。 DataTemplate被正確選擇,但ItemTemplate被忽略。 TabControl的默認模板是什麼意思?對不起,我剛剛開始使用WPF。 – sop3k

+0

我的意思是你展示的XAML應該工作,並且在我的結尾工作。我沒有看到任何明顯的錯誤,所以我的問題是你改變了'TabControl'的模板(它看起來如何),你使用的是像MahApps還是它的默認外觀。明確的'ItemTempate'應該優先於隱含的'DataType'模板 – dkozl

回答

1

你的代碼應該工作,沒有IDE atm。您還可以使用Snoop在運行時檢查綁定。我改變了ContentTemplate爲:

<TabControl.ContentTemplate> 
     <DataTemplate> 
      <ContentPresenter Content="{Binding .}" /> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 

它的工作原理。但即使你的代碼在我的testapp中工作。

0

我發現了Elysium的解決方案。添加代碼添加代碼下面的一切工作正常。

<TabControl.Resources> 
    <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}"> 
     <Setter Property="Header" Value="{Binding Name}"/> 
    </Style> 
</TabControl.Resources>