有没有办法只使用C#构建DataTemplate

时间:2018-05-28 18:11:47

标签: c# wpf datatemplate

有没有办法构建DataTemplate而不使用deprecated FrameworkElementFactoryXamlReader.Load字符串解释方法来代码(related question)(another related)

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字符串在运行时解析,以获得构造函数,方法,属性......感觉很糟糕。 FrameworkElementFactory已被弃用了几个版本,但从未真正替换过。

2 个答案:

答案 0 :(得分:7)

  

有没有办法只使用C#

构建DataTemplate

是的,您使用FrameworkElementFactoryXamlReader.Load方法以编程方式创建DataTemplate

  

...不使用已弃用的FrameworkElementFactoryXamlReader.Load方法?

简短回答:不。

为什么在已经有两种情况下你还需要另一种方式?另请注意,如果您不想使用字符串,则可以使用FrameworkElementFactory类。尽管MSDN上的文档说明了这种类型,但在.NET Framework 4.7.2中并没有真正标记为过时或弃用。

答案 1 :(得分:4)

详细说明@ mm8的答案:不,因为如果你检查FrameworkTemplate.LoadContent方法,你会发现模板基本上是一个使用FrameworkElementFactoryTemplateContent的包装器加载内容,TemplateContent是一个实用程序来读取 XAML 节点流。所以这些是模板可以运行的唯一两种方式。

就个人而言,我建议使用 XAML (作为单独的 * .xaml 文件,而不是string),因为它很远更可读,但也因为FrameworkElementFactory具有有限的功能,即它只支持依赖属性和路由事件(您不能创建一个设置常规 CLR 属性或事件处理程序的工厂)。它有一个优于 XAML 的优点 - 它确实支持泛型类,所以两者的混合可能是最合适的方法。