是否有一种只使用C#就能构建DataTemplate的方法?

24
有没有一种方法可以在不使用已弃用的FrameworkElementFactoryXamlReader.Load方法将字符串解释为代码(相关问题)(另一个相关问题)的情况下构建DataTemplate?
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个回答

7
有办法只使用C#构建DataTemplate吗?
可以,您可以使用FrameworkElementFactory或XamlReader.Load方法来动态创建DataTemplate。
……而不使用已弃用的FrameworkElementFactory或XamlReader.Load方法呢?
简短回答:不行。
既然已经有两种方法了,为什么还需要另一种方式?此外,请注意,如果您不想使用字符串,则使用FrameworkElementFactory类是完全可以的。尽管MSDN上的文档显示该类型在.NET Framework 4.7.2中标记为过时,但实际上它并未过时。

4
为了详细说明 @mm8 的答案:不可以,因为如果你检查 FrameworkTemplate.LoadContent 方法,你会发现模板基本上是一个包装器,它使用 FrameworkElementFactoryTemplateContent 来加载内容,其中 TemplateContent 是一个实用程序,用于读取 XAML 节点流。所以这些是模板可以操作的唯一两种方式。
个人而言,在这两种方法中,我建议使用 XAML(作为单独的 *.xaml 文件而不是 string),因为它更易读,但也因为 FrameworkElementFactory 功能有限,即它仅支持依赖属性和路由事件(不能创建设置常规 CLR 属性或事件处理程序的工厂)。它有一个优点,就是它支持通用类,因此混合使用这两种方法可能是最适当的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接