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