2009-09-15 9 views
24

Donc, évidemment, je fais quelque chose de mal, mais je n'arrive tout simplement pas à obtenir le HierarchicalDataTemplate (ou même seulement DataTemplate) pour travailler avec la propriété DataType. J'ai créé l'application WPF la plus courte possible pour démontrer le problème.Comment utiliser la propriété DataType sur un DataTemplate WPF?

XAML:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:System="clr-namespace:System;assembly=mscorlib" 
    xmlns:local="clr-namespace:WpfApplication1" 
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded"> 
    <Window.Resources> 
     <HierarchicalDataTemplate DataType="x:Type local:Foo"> 
      <TextBlock Text="I am a Foo" /> 
     </HierarchicalDataTemplate> 
     <HierarchicalDataTemplate DataType="x:Type System:String"> 
      <TextBlock Text="I am a String" /> 
     </HierarchicalDataTemplate> 
    </Window.Resources> 
    <Grid> 
     <TreeView Name="treeView1" ItemsSource="{Binding}" /> 
    </Grid> 
</Window> 

CODE:

namespace WpfApplication1 
{ 
    public class Foo 
    { 
     public string Name { get; set; } 
    } 

    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      var list = new List<object> { "a", 1, "b", 2, new Foo() { Name="Brian"}}; 
      treeView1.DataContext = list; 
     } 
    } 
} 

Il est évident que j'attends qu'il affiche ce qui suit dans l'arborescence.

I am a string 
1 
I am a string 
2 
I am a foo 

Mais mon application affiche réellement ce qui suit.

a 
1 
b 
2 
WpfApplication1.Foo 

La chose étrange est que presque tous les exemples que je vois sur le web fait cette chose (avec des variations légères) et personne ne semble être un problème avec elle. Pourtant, j'ai essayé d'innombrables façons de réorganiser le XAML et rien ne semble aider. J'espère qu'un autre couple d'yeux peut aider.

Répondre

35

Votre code est bien, mais vos valeurs d'attribut DataType doivent être enveloppé dans des accolades:

<HierarchicalDataTemplate DataType="{x:Type local:Foo}"> 
    <TextBlock Text="I am a Foo" /> 
</HierarchicalDataTemplate> 
<HierarchicalDataTemplate DataType="{x:Type System:String}"> 
    <TextBlock Text="I am a String" /> 
</HierarchicalDataTemplate> 
+4

Haha ... c'est tellement embarrassant. Il n'y a aucun moyen de dire à l'un de vous combien de temps j'ai passé à travailler dessus :) –

+0

Je * pense * que vous pouvez aussi sortir avec DataType = "local: Foo" (sans le x: Type ou les accolades) alors ne sois pas gêné. C'est une erreur facile à faire! –

+12

@Brian, bienvenue sur la courbe d'apprentissage WPF. Vous rencontrerez BEAUCOUP de ceux-ci, ne les laissez pas vous abattre. – user7116

2

Vous n'avez pas spécifié la propriété ItemTemplate de TreeView. Cette propriété indique la TreeView qui DataTemplate à utiliser, dans votre cas, vous voulez spécifier celui défini dans vos ressources:

<TreeView Name="treeView1" 
      ItemsSource="{Binding}" 
      ItemTemplate="{StaticResource MyResourceItemTemplate}" /> 

Mais dans votre cas, vous pouvez réellement utiliser une implémentation DataTemplateSelector appliquée à la propriété TreeView.ItemTemplateSelector pour le choix d'un modèle différent en fonction du type à afficher ...

+0

Je suis un novice de WPF, mais je crois que ItemTemplate n'est pas nécessaire lors de l'utilisation des correspondances de type de données par opposition à x: Correspondances de touches. En fait, la solution de Matt fonctionne, ce qui doit être le cas. Et oui, DataTemplateSelector est ma prochaine tâche. Cependant, je pense que je vais avoir plus de chance cette fois. Merci pour votre temps. –

+1

DataTemplate pour un type de données peut être automatiquement appliqué au type de date, s'il est correctement défini. – Gqqnbig

3

aussi, si vous n'êtes pas usin Si vous utilisez ItemsSource du HierarchicalDataTemplate, vous pouvez également utiliser un DataTemplate.

+0

Ouais, en fait j'utilise ItemsSource dans ma vraie application, mais bon point néanmoins. –

Questions connexes