簡體   English   中英

如何在樹視圖的代碼中設置WPF datatemplate?

[英]How to setup a WPF datatemplate in code for a treeview?

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,並在運行時解析它:

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現在將其稱為已棄用,因此我不會包含用於演示的代碼...

而不是像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);

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方法會迅速變得非常復雜......!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM