代码之家  ›  专栏  ›  技术社区  ›  Brian Gideon

如何在WPF数据模板上使用DataType属性?

  •  32
  • Brian Gideon  · 技术社区  · 15 年前

    所以很明显我做错了什么,但是在使用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>
    

    代码:

    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 回复  |  直到 8 年前
        1
  •  46
  •   Ryan    8 年前

    代码很好,但数据类型属性值需要用大括号括起来:

    <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>
    
        2
  •  3
  •   Josh    15 年前

    另外,如果不使用HierarchicalDataTemplate的itemsSource,也可以使用DataTemplate。

        3
  •  2
  •   Simon Fox    15 年前

    尚未指定TreeView的ItemTemplate属性。此属性告诉TreeView要使用哪个数据模板,在这种情况下,您希望指定在资源中定义的数据模板:

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

    但在您的情况下,您可能实际上想使用 DataTemplateSelector 实施适用于 TreeView.ItemTemplateSelector 属性,用于根据要显示的类型选择其他模板…