2010-10-30 10 views
31

Je veux juste comprendre le scénario suivant. Là où je suis un <TabControl> lié la mise en œuvre à un ObservableCollection<TabViewModel>WPF: TabControl & DataTemplates

Aucun modèle de données

Quand je n'ai pas DataTemplate s, le texte WpfApplication1.TabViewModel apparaît dans l'onglet En-tête et le contenu. Ok je comprends cette partie.

Juste ItemTemplate

Lorsque je viens de

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

Ensuite, mon en-tête de l'onglet est rempli. Le contenu de l'onglet est toujours WpfApplication1.TabViewModel.

Juste DataTemplate

Quand j'ai juste le bas dans mon <Window.Resources>

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

que les modèles remplit l'en-tête de l'onglet.

deux

Quand j'ai à la fois, la ItemTemplate remplit l'en-tête Tab tandis que le DataTemplate remplit le contenu de l'onglet. Pourquoi toute cette différence. ItemTemplate & DataTemplate remplit l'en-tête de l'onglet si l'autre n'est pas présent. Si les deux sont présents, ItemTemplate remplit l'en-tête tandis que DataTemplate remplit le contenu.

Bien que j'ai des choses qui fonctionnent, je suis assez confus. Ne devrait pas quelque chose comme <TabControl.HeaderTemplate> être ce qui remplit l'en-tête et <TabControl.ItemTemplate> remplir le contenu?

Répondre

50

Tout d'abord, il y a deux modèles impliqués ici:

  • TabControl.ItemTemplate, utilisés pour rendre les TabItem têtes
  • TabControl.ContentTemplate, utilisés pour rendre le TabItem contenu

Si vous n » t définissez ces propriétés explicitement, puis WPF tentera de les résoudre ailleurs. Il parcourt l'arborescence logique à la recherche d'une ressource lui indiquant comment rendre votre modèle de vue. S'il trouve un DataTemplate qui a un DataType correspondant mais aucune clé, il l'utilisera pour rendre le modèle de vue. S'il n'en trouve pas, il affichera par défaut la valeur ToString de l'objet.

Donc, si vous voulez être explicite, vous voulez quelque chose comme ceci:

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

Puisque vous n'êtes pas être précis, WPF tente de marcher votre arbre logique de trouver un DataTemplate approprié. Quand il le trouve, il l'utilise pour rendre le modèle de vue.Où il ne le trouve pas, il appelle ToString et rend cela.

Donc, pour répondre à vos cas particuliers:

Juste ItemTemplate

Vous avez explicitement déclaré comment rendre réglettes, mais pas le contenu de l'onglet. Ainsi, le premier est rendu en utilisant le DataTemplate fourni, mais le dernier sera ToString par défaut.

Juste DataTemplate

Vous avez pas explicitement indiqué comment rendre soit réglettes ou le contenu de l'onglet. Par conséquent, WPF recherche un DataTemplate approprié pour les deux. Comme les deux contiennent une instance de votre modèle de vue (DataContext), le même DataTemplate sera utilisé pour afficher les en-têtes des onglets et leur contenu.

REMARQUE: vous n'avez pas déclaré explicitement que c'est ce qui se passe dans votre question. Corrige moi si je me trompe.

deux

Dans ce cas, vous avez explicitement indiqué comment rendre réglettes, mais pas le contenu de l'onglet. Par conséquent, le DataTemplate explicite est utilisé pour les en-têtes d'onglet et le DataTemplate implicite est utilisé pour le contenu des onglets.

+0

Si je veux la zone de liste avec le contenu et la source de l'élément de contrôle de tabulation aura la liste d'éléments pour la zone de liste .. Que puis-je faire pour cela? La boîte de liste a également le modèle de données avec lui-même – Programmer

+0

"Tout d'abord, il y a deux modèles impliqués ici ..." Argh! On pourrait penser que la façon dont vous spécifiez un TabItem en dehors d'un DataTemplate fonctionne de la même manière dans une propriété TabControl ItemTemplate, puisque ListView et al. travailler de cette façon. Merci! – user1454265

Questions connexes