【问题标题】:How do I use the DataType property on a WPF DataTemplate?如何在 WPF DataTemplate 上使用 DataType 属性?
【发布时间】:2009-09-15 00:30:39
【问题描述】:

很明显我做错了什么,但在使用 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 的方法,但似乎没有任何帮助。我希望另一双眼睛可以提供帮助。

【问题讨论】:

    标签: c# .net wpf xaml


    【解决方案1】:

    您的代码很好,但是您的 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>
    

    【讨论】:

    • 哈哈……太尴尬了。我不可能 100% 告诉你们我在这方面花了多长时间 :)
    • 认为您也可以使用 DataType="local:Foo" (没有 x:Type 或花括号),所以不要尴尬。这是一个容易犯的错误!
    • @Brian,欢迎来到 WPF 学习曲线。你会遇到很多这样的,不要让他们让你失望。
    • 谢谢你们俩的鼓励。 WPF 与 WinForms 有很大不同……但非常酷。我真的很喜欢我目前所看到的。
    • @MattHamilton:“我认为你也可以使用 DataType="local:Foo" (没有 x:Type 或花括号)”——仅供参考,我试过了没用。
    【解决方案2】:

    此外,如果您不使用 HierarchicalDataTemplate 的 ItemsSource,您也可以使用 DataTemplate。

    【讨论】:

    • 是的,实际上我在我的实际应用程序中使用了 ItemsSource,但还是有好处。
    【解决方案3】:

    您尚未指定 TreeView 的 ItemTemplate 属性。此属性告诉 TreeView 要使用哪个 DataTemplate,在您的情况下,您想指定资源中定义的那个:

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

    但在您的情况下,您实际上可能希望使用应用于TreeView.ItemTemplateSelector 属性的DataTemplateSelector 实现,以根据要显示的类型选择不同的模板...

    【讨论】:

    • 我是 WPF 新手,但我相信使用数据类型匹配而不是 x:Key 匹配时不需要 ItemTemplate。实际上,马特的解决方案有效,因此必须如此。是的,DataTemplateSelector 是我的下一个任务。不过,我想这次我的运气会更好。感谢您的宝贵时间。
    • 如果设置正确,数据类型的DataTemplate可以自动应用于日期类型。
    猜你喜欢
    • 1970-01-01
    • 2021-01-08
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多