Есть ли способ построить DataTemplate только с С#

Есть ли способ построить DataTemplate без использования устаревшего FrameworkElementFactory или метода XamlReader.Load интерпретации строк для кода (связанный вопрос) или (другого связанного)?

DataTemplate dt = new DataTemplate();
StackPanel sp = new StackPanel();
ComboBox cellComboBox = new ComboBox() { Visibility = Visibility.Collapsed };
CheckBox cellCheckBox = new CheckBox() { Visibility = Visibility.Collapsed };

sp.Children.Add(cellComboBox);
sp.Children.Add(cellCheckBox);

// then add the stackpanel somehow?

Обновление: Почему? Это для новой программы, которая, возможно, должна поддерживаться в течение многих лет. Разбор строки XamlReader во время выполнения для чего-то, что получил конструктор, методы, свойства... чувствует kludgy. FrameworkElementFactory устарел для нескольких версий, но никогда не имел реальной замены.

Ответ 1

Есть ли способ построить DataTemplate только с С#

Да, вы используете метод FrameworkElementFactory или XamlReader.Load для создания DataTemplate программно.

... без использования устаревшего FrameworkElementFactory или метода XamlReader.Load?

Краткий ответ: Нет.

Зачем вам нужен еще один способ, когда уже есть два? Также обратите внимание, что отлично использовать класс FrameworkElementFactory если вы не хотите использовать строки. Несмотря на то, что говорится в документации по MSDN, этот тип на самом деле не помечен как устаревший или устаревший в.NET Framework 4.7.2.

Ответ 2

Чтобы уточнить ответ @mm8: нет, потому что, если вы проверите метод FrameworkTemplate.LoadContent вы обнаружите, что шаблон в основном представляет собой оболочку, которая использует либо FrameworkElementFactory либо TemplateContent для загрузки содержимого, TemplateContent - это утилита для чтения узла XAML поток. Таким образом, это только два способа, которыми может работать шаблон.

Лично из двух я бы рекомендовал использовать XAML (как отдельный *.xaml файл, а не string), потому что он гораздо читабельнее, но также потому, что FrameworkElementFactory имеет ограниченную функциональность, то есть он поддерживает только свойства зависимостей и маршрутизируемые события ( вы не можете создать фабрику, которая установит обычное свойство CLR или обработчик событий). У него есть одно преимущество перед XAML, хотя он поддерживает универсальные классы, поэтому, возможно, сочетание двух является самым правильным подходом.