2009-09-15 11 views
24

Obviamente, estoy haciendo algo mal, pero parece que no puedo hacer que HierarchicalDataTemplate (o incluso solo DataTemplate) funcione cuando se usa la propiedad DataType. Creé la aplicación WPF más corta posible para demostrar el problema.¿Cómo uso la propiedad DataType en un WPF DataTemplate?

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> 

CÓDIGO:

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

Obviamente, yo estoy esperando que aparezca el siguiente en la vista de árbol.

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

Pero mi aplicación realmente muestra lo siguiente.

a 
1 
b 
2 
WpfApplication1.Foo 

Lo más curioso es que casi todos los ejemplos que veo en la web hace esto mismo (con ligeras variaciones) y nadie más parece tener un problema con él. Sin embargo, he intentado innumerables formas diferentes de reorganizar el XAML y nada parece ayudar. Espero que otro par de ojos pueda ayudar.

Respuesta

35

Su código está bien, pero sus valores de atributo DataType necesita ser envuelto en llaves:

<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

Jaja ... eso es tan embarazoso. No hay manera de que les diga a ninguno de ustedes cuánto tiempo pasé trabajando en esto :) –

+0

I * think * también puede salirse con DataType = "local: Foo" (sin la x: Tipo o llaves) , así que no te avergüences. ¡Es un error fácil de hacer! –

+12

@Brian, bienvenido a la curva de aprendizaje de WPF. Te encontrarás con MUCHOS de estos, no dejes que te depriman. – user7116

2

No ha especificado la propiedad ItemTemplate de TreeView. Esta propiedad le dice al TreeView, que DataTemplate de usar, en su caso desea especificar el definido en sus recursos:

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

Pero en el caso de que en realidad puede que quiera usar una aplicación DataTemplateSelector aplica a la propiedad TreeView.ItemTemplateSelector de la elección de una plantilla diferente en función del tipo que se muestra ...

+0

Soy un novato de WPF, pero creo que ItemTemplate no es necesario cuando se usan coincidencias de tipos de datos en oposición a x: coincidencias clave. En realidad, la solución de Matt funciona así debe ser el caso. Y sí, DataTemplateSelector es mi próxima tarea. Sin embargo, creo que tendré mejor suerte esta vez. Gracias por tu tiempo. –

+1

DataTemplate para un tipo de datos se puede aplicar automáticamente al tipo de fecha, si se establece correctamente. – Gqqnbig

3

Además, si usted no está usin g el ItemsSource de HierarchicalDataTemplate también puede usar un DataTemplate.

+0

Sí, en realidad estoy usando ItemsSource en mi aplicación real, pero sin embargo es un buen punto. –

Cuestiones relacionadas