2009-09-15 19 views
24

Quindi ovviamente sto facendo qualcosa di sbagliato, ma non riesco proprio a far funzionare HierarchicalDataTemplate (o anche solo DataTemplate) quando utilizzo la proprietà DataType. Ho creato l'applicazione WPF più breve possibile per dimostrare il problema.Come utilizzare la proprietà DataType su 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> 

CODICE:

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

Ovviamente mi aspetto che visualizza il seguente nella vista ad albero.

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

Ma la mia applicazione visualizza effettivamente quanto segue.

a 
1 
b 
2 
WpfApplication1.Foo 

La cosa strana è che quasi tutti gli esempi che vedo sul web lo fa questa cosa molto (con lievi variazioni) e nessun altro sembra avere un problema con esso. Eppure ho provato innumerevoli modi diversi di riorganizzare lo XAML e nulla sembra aiutare. Spero che un altro paio di occhi possa aiutare.

risposta

35

il codice va bene, ma i valori degli attributi DataType bisogno di essere avvolto in parentesi graffe:

<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 ... è così imbarazzante. Non c'è il 100% in alcun modo che io possa dire a nessuno di voi quanto tempo ho passato a lavorare su questo :) –

+0

I * think * è possibile anche scappare con DataType = "local: Foo" (senza x: Type o le parentesi graffe) , quindi non essere imbarazzato. È un errore facile da fare! –

+12

@Brian, benvenuto nella curva di apprendimento di WPF. Ne troverai MOLTI di questi, non lasciarti abbattere. – user7116

2

Non è stata specificata la proprietà ItemTemplate di TreeView. Questa proprietà indica al TreeView, che DataTemplate da utilizzare, nel tuo caso si desidera specificare quello definito nelle risorse:

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

Ma nel vostro caso si può effettivamente desidera utilizzare un'implementazione DataTemplateSelector applicata alla proprietà TreeView.ItemTemplateSelector per la scelta di un modello diverso in base al tipo da visualizzare ...

+0

Sono un principiante WPF, ma credo che ItemTemplate non sia richiesto quando si utilizza corrispondenze di tipo di dati al posto di x: corrispondenza di chiave. In realtà, la soluzione di Matt funziona così che deve essere il caso. E sì, DataTemplateSelector è il mio prossimo compito. Comunque, penso che questa volta avrò più fortuna. Grazie per il tuo tempo. –

+1

DataTemplate per un tipo di dati può essere applicato automaticamente al tipo di data, se impostato correttamente. – Gqqnbig

3

anche se non si è usin g the ItemsSource di HierarchicalDataTemplate puoi utilizzare invece un DataTemplate.

+0

Sì, in realtà sto usando ItemsSource nella mia vera applicazione, ma comunque buon punto. –

Problemi correlati