Как настроить табличный шаблон WPF в коде для дерева? - PullRequest
3 голосов
/ 20 марта 2010
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 для имен элементов дерева.

Ответы [ 3 ]

7 голосов
/ 20 марта 2010

Есть два подхода. Самый простой - просто сгенерировать 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 теперь называет это устаревшим, я не буду включать код для демонстрации ...

4 голосов
/ 14 ноября 2012

Вместо создания своего собственного 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 голосов
/ 20 марта 2010

Рид уже рассмотрел подход "создай свой собственный XAML", но просто для иллюстрации подхода FrameworkElementFactory он будет выглядеть примерно так:

Сначала создайте FEF:

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

Затем создайте DataTemplate с его VisualTree, установленным на эту фабрику:

DataTemplate dt = new DataTemplate { VisualTree = fef };

Хотя, как отмечает Рид, подход FrameworkElementFactory официально устарел, но он все еще достаточно широко используется, я полагаю, потому что сборка строк XAML кажется такой грязной. (Хотя подход FEF быстро становится безумно сложным, если у вас нетривиальный шаблон ...!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...