2010-10-30 55 views
31

我只是想了解以下情況。我在哪裏實施<TabControl>綁定到一個ObservableCollection<TabViewModel>WPF:TabControl&DataTemplates

無數據模板

當我沒有任何DataTemplate秒,文本WpfApplication1.TabViewModel出現在選項卡標題和內容。好吧,我明白這一部分。

只是ItemTemplate

當我剛剛有

<TabControl.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding TabTitle}" /> 
     </StackPanel> 
    </DataTemplate> 
</TabControl.ItemTemplate> 

然後我的標籤頭填充。標籤內容仍然爲WpfApplication1.TabViewModel

只是DataTemplate

當我只是有低於我<Window.Resources>

<DataTemplate DataType="{x:Type local:TabViewModel}"> 
    <TextBox Text="{Binding Text}" /> 
</DataTemplate> 

的模板填充的選項卡標題。

兩個

當我有兩個,在ItemTemplate填補了選項卡標題,而DataTemplate填補了標籤的內容。爲什麼所有這些差異。 ItemTemplate & DataTemplate如果另一個不存在,填滿標籤頁眉。如果兩者都存在,則ItemTemplate填充標題,而DataTemplate填充內容。

雖然我有事情的工作,我很困惑。應該不是像<TabControl.HeaderTemplate>這樣的填充內容是什麼填充頭和<TabControl.ItemTemplate>

回答

50

首先,有兩個模板這裏涉及到:

  • TabControl.ItemTemplate,用來渲染TabItem
  • TabControl.ContentTemplate,用來渲染TabItem內容

如果你不」 t顯式設置這些屬性,那麼WPF將嘗試在其他地方解決它們。它會沿着邏輯樹尋找一個資源,告訴它如何渲染你的視圖模型。如果它發現DataTemplate具有匹配的DataType但沒有鍵,則它將使用它來呈現視圖模型。如果它找不到,它將默認呈現對象的ToString值。

所以,如果你想成爲明確的,你想是這樣的:

<TabControl ItemsSource="{Binding Tabs}"> 
    <TabControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding TabTitle}"/> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
    <TabControl.ContentTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text}"/> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

既然你不是特定的,WPF試圖走你的邏輯樹找到合適的DataTemplate。當它找到它時,它使用它來渲染視圖模型。它找不到它,它調用ToString並呈現。

因此,要解決您的具體情況:

只是ItemTemplate中

你已經明確表示如何使標籤的信息,但是沒有選項卡的內容。所以前者使用提供的DataTemplate呈現,但後者默認爲ToString

只是DataTemplate中

你沒有明確指出如何使任一選項卡標題或標籤內容。因此,WPF爲兩者搜索合適的DataTemplate。由於兩者都包含您的視圖模型的實例(這是它們的DataContext),因此將使用相同的DataTemplate來呈現選項卡標題及其內容。

注意:您沒有明確說明這是您的問題中發生的事情。如我錯了請糾正我。

兩個

在這種情況下,你已經明確表示如何使標籤的信息,但是沒有選項卡的內容。因此,顯式DataTemplate用於製表符首標,隱含的DataTemplate用於製表符內容。

+0

如果我想要的內容和標籤控制項目源的列表框將有列表框的項目列表..我可以爲此做什麼?列表框也有自己的數據模板 – Programmer 2013-11-19 11:34:35

+0

「首先,這裏涉及兩個模板......」啊!你會認爲你在DataTemplate外指定一個TabItem的方式在TabControl ItemTemplate屬性中是相同的,因爲ListView等人。這樣工作。謝謝! – user1454265 2014-12-10 17:10:23