有没有办法构建DataTemplate而不使用deprecated FrameworkElementFactory
或XamlReader.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
已被弃用了几个版本,但从未真正替换过。
答案 0 :(得分:7)
有没有办法只使用C#
构建DataTemplate
是的,您使用FrameworkElementFactory
或XamlReader.Load
方法以编程方式创建DataTemplate
。
...不使用已弃用的
FrameworkElementFactory
或XamlReader.Load
方法?
简短回答:不。
为什么在已经有两种情况下你还需要另一种方式?另请注意,如果您不想使用字符串,则可以使用FrameworkElementFactory
类。尽管MSDN上的文档说明了这种类型,但在.NET Framework 4.7.2中并没有真正标记为过时或弃用。
答案 1 :(得分:4)
详细说明@ mm8的答案:不,因为如果你检查FrameworkTemplate.LoadContent
方法,你会发现模板基本上是一个使用FrameworkElementFactory
或TemplateContent
的包装器加载内容,TemplateContent
是一个实用程序来读取 XAML 节点流。所以这些是模板可以运行的唯一两种方式。
就个人而言,我建议使用 XAML (作为单独的 * .xaml 文件,而不是string
),因为它很远更可读,但也因为FrameworkElementFactory
具有有限的功能,即它只支持依赖属性和路由事件(您不能创建一个设置常规 CLR 属性或事件处理程序的工厂)。它有一个优于 XAML 的优点 - 它确实支持泛型类,所以两者的混合可能是最合适的方法。