Создание DataTemplate в коде: можно ли использовать свойство Template? - PullRequest
4 голосов
/ 02 августа 2011

Я пытаюсь использовать DataTemplateSelector с определенным сторонним элементом управления сеткой WPF, и у меня возникают проблемы с определением, являются ли проблемы, которые возникают у меня, ошибкой в ​​элементе управления или моим собственным непониманиемсоглашения шаблонов данных WPF.

Я понимаю, что обычный вариант использования DataTemplate состоит в том, чтобы объявить его где-нибудь в XAML (будь то в качестве ресурса или явно там, где он используется), но мой конкретный проект будетбыло бы очень полезно, если бы я мог создать шаблон в коде (в частности, на C #), а не в XAML.Проблема, с которой я сталкиваюсь, заключается в том, что мой созданный код DataTemplate использует FrameworkElementFactory в качестве шаблона VisualTree, тогда как созданный XAML шаблон использует объект TemplateContent в качестве значения Template шаблона.Как я могу сказать прямо сейчас, рассматриваемый элемент управления сеткой работает с шаблонами, использующими Template, но, похоже, не очень хорошо работает с шаблонами, использующими VisualTree.

Для сравнения, воткак один из шаблонов выглядит в XAML как часть моего селектора:

<MySelectorType>
    <MySelectorType.BooleanTemplate>
        <DataTemplate>
            <EditorControl Name="Reserved_Name" />
        </DataTemplate>
    </MySelectorType.BooleanTemplate>
</MySelectorType>

А вот как я пытаюсь создать эквивалентный шаблон в коде:

var template = new DataTemplate()
{
    VisualTree = new FrameworkElementFactory(typeof(EditorControl)) 
                 { 
                     Name = "Reserved_Name" 
                 }
};

I 'Мы также попробовали это так:

var template = new DataTemplate()
{
    VisualTree = new FrameworkElementFactory(typeof(EditorControl))
};

template.VisualTree.SetValue(EditorControl.NameProperty, "Reserved_Name");

Что казалось более аналогичным тому, что будет делать шаблон XAML, но казалось, что оно не работает вообще (редактор не читал и не устанавливалзначение, где по крайней мере первая версия будет читать его).

Возможно ли, чтобы мой шаблон в коде использовал свойство Template вместо VisualTree?Согласно документации , для этого типа нет общедоступного API, и путь его создания сложен, но было ли это сделано?Единственный пример , который я обнаружил, использует жестко закодированный XAML в коде, что мне не подходит.

1 Ответ

2 голосов
/ 02 августа 2011

Мне тоже не нравится этот способ ведения дел, но на самом деле это рекомендуемый способ, в документации к FrameworkElementFactory можно найти следующее:

Этот класс является устаревшим способом программного создания шаблонов, которые являются подклассами FrameworkTemplate, такими как ControlTemplate или DataTemplate;не все функциональные возможности шаблона доступны при создании шаблона с использованием этого класса.Рекомендуемый способ программного создания шаблона - загрузить XAML из строки или потока памяти с помощью метода Load класса XamlReader.

Я не знаю ни одного простого способа использования Template свойство в коде, единственный способ, насколько мне известно, это возможно через много размышлений.


Установка имен - это особый случай, если вы установите Name собственность фабрики должна быть надлежащим образом зарегистрирована, если нет необходимости получать оценку Namescope и , зарегистрировать имя вручную.

...