2010-06-30 4 views
21

Lorsque j'essaie de spécifier plusieurs DataTemplates à utiliser par un ContentControl pour que le bon (basé sur Type) soit utilisé, je me retrouve avec du Contenu qui est simplement le contenu de ContentControl ToString() valeur.Comment utiliser automatiquement un DataTemplate basé sur le type de données Current Content de ContentControl

<ContentControl DataContext="{Binding MyTreeRootViewModels}" Content="{Binding /, Path=CurrentlySelectedTreeViewModel}"> 
    <ContentControl.Resources> 
    <DataTemplate DataType="x:Type vm:TypeAViewModel"> 
     <StackPanel> 
      <local:TypeAUserControl /> 
      </StackPanel> 
    </DataTemplate> 

    <DataTemplate DataType="x:Type vm:TypeBViewModel"> 
     <StackPanel> 
      <local:TypeBUserControl /> 
     </StackPanel> 
    </DataTemplate> 
    </ContentControl.Resources> 
</ContentControl> 

Dans l'exemple ci-dessus, je voyais « MyApp.ViewModel.TypeAViewModel » affiché lorsqu'un noeud d'arbre de TypeAViewModel est retourné par CurrentlySelectedTreeViewModel. Je m'attends à voir mon TypeAViewModelUserControl.

J'ai essayé de mettre un seul élément TextBlock Text < Text = "TESTING"/> dans l'un de mes DataTemplates juste pour voir si le problème était lié à mes contrôles utilisateur. Même résultat

Des idées de ce que je fais mal? (En passant, le CurrentSelectedTreeViewModel est une propriété qui retourne le nœud actuellement sélectionné dans ma vue d'arbre.Il semble fonctionner très bien - comme je sélectionne les nœuds dans l'arbre, le nom de type correct pour le nœud apparaît ContentControl).

+0

Essayer de faire la même chose; mon problème était que je n'avais pas mes 'DataTemplates' dans' ContentControl.Resources'. Votre exemple était ma solution! :) – mbmcavoy

Répondre

25

Le bit x:Type doit être entre accolades {}:

<DataTemplate DataType="{x:Type vm:TypeAViewModel}"> 
+13

Dooh. Merci Bubblewrap. Emmanuel

5

x:Type est un MarkupExtension, qui exige {} pour indiquer au compilateur XAML.

Questions connexes