C# 如何在 WPF DataTemplate 上使用 DataType 属性?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1424554/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I use the DataType property on a WPF DataTemplate?
提问by Brian Gideon
So obviously I am doing something wrong, but I just cannot seem to get the HierarchicalDataTemplate (or even just DataTemplate) to work when using the DataType property. I have created the shortest possible WPF application to demonstrate the problem.
所以很明显我做错了什么,但我似乎无法在使用 DataType 属性时让 HierarchicalDataTemplate(甚至只是 DataTemplate)工作。我创建了最短的 WPF 应用程序来演示这个问题。
XAML:
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;
}
}
}
Obviously I am expecting it display the following in the treeview.
显然,我希望它在树视图中显示以下内容。
I am a string
1
I am a string
2
I am a foo
But my application actually displays the following.
但我的应用程序实际上显示以下内容。
a
1
b
2
WpfApplication1.Foo
The strange thing is that almost every example I see on the web does this very thing (with slight variations) and no one else seems to be having a problem with it. Yet I have tried countless different ways of rearranging the XAML and nothing seems to help. I am hoping another pair eyes can help.
奇怪的是,我在网上看到的几乎每个例子都做这件事(略有不同),而且似乎没有其他人对此有疑问。然而,我尝试了无数不同的方法来重新排列 XAML,但似乎没有任何帮助。我希望另一双眼睛可以提供帮助。
采纳答案by Matt Hamilton
Your code is fine, but your DataType attribute values need to be wrapped in curly braces:
您的代码很好,但您的 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>
回答by Simon Fox
You haven't specified the ItemTemplate property of the TreeView. This property tells the TreeView which DataTemplate to use, in your case you want to specify the one defined in your resources:
您尚未指定 TreeView 的 ItemTemplate 属性。此属性告诉 TreeView 使用哪个 DataTemplate,在您的情况下,您要指定资源中定义的那个:
<TreeView Name="treeView1"
ItemsSource="{Binding}"
ItemTemplate="{StaticResource MyResourceItemTemplate}" />
But in your case you may actually want to use a DataTemplateSelectorimplementation applied to the TreeView.ItemTemplateSelector
property for choosing a different template based on the type to be displayed...
但是在您的情况下,您实际上可能希望使用应用于该属性的DataTemplateSelector实现,以TreeView.ItemTemplateSelector
根据要显示的类型选择不同的模板...
回答by Josh
Also if you aren't using the ItemsSource of the HierarchicalDataTemplate you may as well use a DataTemplate instead.
此外,如果您不使用 HierarchicalDataTemplate 的 ItemsSource,您也可以改用 DataTemplate。