【问题标题】:How to setup a WPF datatemplate in code for a treeview?如何在代码中为树视图设置 WPF 数据模板?
【发布时间】:2012-11-14 05:40:13
【问题描述】:
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 ) };
        }
    }

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

【问题讨论】:

  • 您不使用 XAML 并尝试在代码中执行所有操作是否有原因?在 WPF 中,这通常不是必需的,只会让生活变得更加困难......
  • 原因是我对 xaml 感觉不太舒服,因为我已经习惯了 windows 窗体。

标签: c# .net wpf data-binding


【解决方案1】:

有两种方法。最简单的方法是只生成 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 class。然而,这是相当复杂的,并且很难“正确”。由于 MSDN 现在将此称为已弃用,因此我不会包含用于演示的代码...

【讨论】:

  • 我真的很惊讶它这么复杂。但我猜就是这样。
【解决方案2】:

不像 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 方法会迅速变得异常复杂......!)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多