Как использовать свойство DataType в шаблоне данных WPF? - PullRequest
32 голосов
/ 15 сентября 2009

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

КОД:

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

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

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

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

a
1
b
2
WpfApplication1.Foo

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

Ответы [ 3 ]

46 голосов
/ 15 сентября 2009

Ваш код в порядке, но значения вашего атрибута 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>
3 голосов
/ 15 сентября 2009

Также, если вы не используете ItemsSource в HierarchicalDataTemplate, вы можете использовать вместо него DataTemplate.

2 голосов
/ 15 сентября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...