如何在代码中为树形视图设置WPF数据模板?

3
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<Drink> coldDrinks = new List<Drink> ( ){
    new Drink ( "Water", 1 ),
    new Drink ( "Fanta", 2 ),
    new Drink ( "Sprite", 3 ),
    new Drink ( "Coke", 4 ),
    new Drink ( "Milk", 5 ) };
        }
    }

为了能够查看树形视图项名称的名称属性。

你为什么不使用XAML,而要尝试在代码中完成所有工作?在WPF中,这通常是不必要的,只会让生活变得更加困难... - Reed Copsey
1
原因是我一开始对XAML不太熟悉,因为我习惯了Windows表单。 - Joan Venge
3个回答

7

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

string xaml = "<DataTemplate><TextBlock Text=\"{Binding Name}\"/></DataTemplate>";
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现在将其视为已弃用,我不会包括演示代码...

1
我真的很惊讶这个问题这么复杂。但是我猜就是这样吧。 - Joan Venge

4

不需要像Reed说的那样创建自己的XAML,您可以使用控件XAML来获取它。

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

您可以随后编辑XAML并创建您的控件模板/数据模板

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

3

Reed已经介绍了“构建自己的XAML”方法,但为了阐述FrameworkElementFactory方法,它看起来会像这样。

首先,创建FEF:

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

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

DataTemplate dt = new DataTemplate { VisualTree = fef };

虽然Reed指出FrameworkElementFactory方法已经被官方弃用了,但它仍然得到了相当广泛的使用,我想这是因为构建XAML字符串感觉很笨拙。 (尽管如果你有一个非平凡的模板,FEF方法会迅速变得非常复杂...!)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接