显然我做错了什么,但是在使用DataType属性时,我似乎无法使HierarchicalDataTemplate(甚至只是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;
}
}
}
显然我希望它在树视图中显示以下内容。
I am a string
1
I am a string
2
I am a foo
但我的应用程序实际显示以下内容。
a
1
b
2
WpfApplication1.Foo
奇怪的是,我在网上看到的几乎所有例子都做了这件事(略有不同)并且没有其他人似乎对它有任何问题。然而,我尝试了无数种不同的重新安排XAML的方法,似乎没有任何帮助。我希望另一双眼睛可以提供帮助。
答案 0 :(得分:46)
您的代码很好,但您的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>
答案 1 :(得分:3)
此外,如果您不使用HierarchicalDataTemplate的ItemsSource,您也可以使用DataTemplate。
答案 2 :(得分:2)
您尚未指定TreeView的ItemTemplate属性。此属性告诉TreeView要使用哪个DataTemplate,在您的情况下,您要指定资源中定义的那个:
<TreeView Name="treeView1"
ItemsSource="{Binding}"
ItemTemplate="{StaticResource MyResourceItemTemplate}" />
但在您的情况下,您实际上可能希望使用应用于TreeView.ItemTemplateSelector
属性的DataTemplateSelector实现来根据要显示的类型选择不同的模板...