2009-09-15 4 views
24

Так что, очевидно, я делаю что-то неправильно, но я просто не могу заставить HierarchicalDataTemplate (или даже просто DataTemplate) работать при использовании свойства DataType. Я создал кратчайшее возможное приложение WPF для демонстрации проблемы.Как использовать свойство DataType на 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> 

КОД:

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

Очевидно, я ожидал, что дисплей следующий экран в TreeView.

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

Но мое приложение фактически отображает следующее.

a 
1 
b 
2 
WpfApplication1.Foo 

Самое странное в том, что почти каждый пример, который я вижу в Интернете делает эту самую вещь (с небольшими вариациями), и никто больше не кажется, что имеет проблемы с ним. Тем не менее я пробовал бесчисленные различные способы перестановки XAML, и ничто, похоже, не помогает. Я надеюсь, что другие пары могут помочь.

ответ

35

Вашего кода хорошо, но ваши значения атрибутов DATATYPE должны быть обернуты в фигурных скобках:

<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

Ха-ха ... это так неловко. Существует 100%, я не говорю никому из вас, как долго я работал над этим :) –

+0

Я * думаю * вы также можете уйти с DataType = "local: Foo" (без x: Тип или фигурные скобки) , так что не стесняйтесь. Это простая ошибка! –

+12

@Brian, добро пожаловать на кривую обучения WPF. Вы столкнетесь с МНОГИМ из них, не позволяйте им сбивать вас. – user7116

2

Вы не указали свойство ItemTemplate TreeView. Это свойство указывает TreeView, который DataTemplate использовать в вашем случае, если вы хотите, чтобы указать один определенный в ваших ресурсах:

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

Но в вашем случае, вы можете на самом деле хотите использовать DataTemplateSelector реализации применительно к TreeView.ItemTemplateSelector собственности для выбрав другой шаблон на основе типа, который будет отображаться ...

+0

Я новичок в WPF, но я считаю, что ItemTemplate не требуется при использовании совпадений типов данных в противоположность x: совпадения клавиш. На самом деле решение Мэтта так и должно быть. И да, DataTemplateSelector - это моя следующая задача. Хотя, я думаю, мне повезет на этот раз. Спасибо за ваше время. –

+1

DataTemplate для типа данных может автоматически применяться к типу даты, если он установлен правильно. – Gqqnbig

3

Кроме того, если вы не Усин g ItemsSource файла HierarchicalDataTemplate, вы также можете использовать DataTemplate.

+0

Да, на самом деле я использую ItemsSource в своем реальном приложении, но, тем не менее, хороший момент. –

Смежные вопросы