c# – 在代码中创建DataTemplate:我可以使用Template属性吗?

我正在尝试将DataTemplateSelector与特定的第三方
WPF网格控件一起使用,并且我无法确定我遇到的问题是否是控件中的错误或我自己对WPF数据的约定缺乏了解模板.

我意识到DataTemplate的普通用例是在XAML中声明它(无论是作为资源还是显式使用它),但是如果我可以在代码中创建模板(特别是C#),我的特定项目将会受益匪浅.而不是在XAML中.我遇到的问题是我的代码创建的DataTemplate使用FrameworkElementFactory作为模板的VisualTree,而XAML创建的模板使用TemplateContent对象作为模板的Template值.我现在可以告诉你,所讨论的网格控件适用于使用模板的模板,但似乎不能很好地使用使用VisualTree的模板.

通过比较,这里是XAML中的一个模板作为我的选择器的一部分:

<MySelectorType>
    <MySelectorType.BooleanTemplate>
        <DataTemplate>
            <EditorControl Name="Reserved_Name" />
        </DataTemplate>
    </MySelectorType.BooleanTemplate>
</MySelectorType>

以下是我尝试在代码中创建等效模板的方法:

var template = new DataTemplate()
{
    VisualTree = new FrameworkElementFactory(typeof(EditorControl)) 
                 { 
                     Name = "Reserved_Name" 
                 }
};

我也试过这样:

var template = new DataTemplate()
{
    VisualTree = new FrameworkElementFactory(typeof(EditorControl))
};

template.VisualTree.SetValue(EditorControl.NameProperty, "Reserved_Name");

这似乎更类似于XAML模板的功能,但似乎根本不起作用(编辑器既不读取也不设置值,至少第一个版本会读取它).

我的代码内模板是否可以使用Template属性而不是VisualTree?根据the documentation,这种类型没有公共API,实例化路径很复杂,但这已经完成了吗?我发现的唯一example在代码中使用了硬编码的XAML,这对我来说并不合适.

最佳答案 我不喜欢这种做事方式,但这实际上是推荐的方式,在
FrameworkElementFactory的文档中可以找到以下内容:

This class is a deprecated way to programmatically create templates, which are subclasses of FrameworkTemplate such as ControlTemplate or DataTemplate; not all of the template functionality is available when you create a template using this class. The recommended way to programmatically create a template is to load XAML from a string or a memory stream using the Load method of the XamlReader class.

我不知道在代码中使用Template属性的任何简单方法,我可能知道的唯一方法是通过大量反思.

设置名称是一种特殊情况,如果您设置了工厂的Name属性,它应该正确注册,如果不是,您需要手动获取approriate Namescoperegister名称.

点赞