如何在树视图的代码中设置WPF datatemplate?

struct Drink { public string Name { get; private set; } public int Popularity { get; private set; } public Drink ( string name, int popularity ) : this ( ) { this.Name = name; this.Popularity = popularity; } } List coldDrinks = new List ( ){ new Drink ( "Water", 1 ), new Drink ( "Fanta", 2 ), new Drink ( "Sprite", 3 ), new Drink ( "Coke", 4 ), new Drink ( "Milk", 5 ) }; } } 

这样我就可以看到树视图项名称的Name属性。

Reed已经介绍了“构建自己的XAML”方法,但只是为了提供FrameworkElementFactory方法的说明,它看起来像这样。

首先,创建FEF:

 var fef = new FrameworkElementFactory(typeof(TextBlock)); fef.SetBinding(TextBlock.TextProperty, new Binding("Name")); 

然后创建一个DataTmplate,其VisualTree设置为该工厂:

 DataTemplate dt = new DataTemplate { VisualTree = fef }; 

虽然Reed注意到FrameworkElementFactory方法已被正式弃用,但它仍然被广泛使用,我想因为构建XAML字符串感觉非常糟糕。 (尽管如果你有一个非平凡的模板,FEF方法会迅速变得非常复杂……!)

有两种方法。 最简单的方法是生成xaml,并在运行时解析它:

 string xaml = ""; MemoryStream sr = new MemoryStream(Encoding.ASCII.GetBytes(xaml)); ParserContext pc = new ParserContext(); pc.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation"); pc.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml"); DataTemplate datatemplate = (DataTemplate)XamlReader.Load(sr, pc); treeView1.Resources.Add("dt", datatemplate); 

第二个选项是使用FrameworkElementFactory类 。 然而,这是非常复杂的,并且难以“正确”。 由于MSDN现在将其称为已弃用,因此我不会包含用于演示的代码…

而不是像Reed那样创建自己的XAML,而是可以通过使用获得控件XAML

 String myXAML = System.Windows.Markup.XamlWriter.Save(yourControl.Template) 

然后,您可以编辑XAML并创建controltemplate / datatemplate

 var xamlStream = new MemoryStream(System.Text.Encoding.Default.GetBytes(myXAML)); _buttonControlTemplate = (ControlTemplate)System.Windows.Markup.XamlReader.Load(xamlStream);