在代码中创建数据模板:我能使用模板属性吗?

4
我正在尝试使用 DataTemplateSelector 与特定的第三方 WPF 网格控件,并且我有困难确定我遇到的问题是控件中的 bug 还是我自己对 WPF 数据模板的惯例理解不够。
我知道一个 DataTemplate 的普通用途是在 XAML 中声明它(无论是作为资源还是明确指定它的位置),但是如果我能够在代码(具体来说是 C#)中创建模板,而不是在 XAML 中创建,那么我的特定项目将大有裨益。 我遇到的问题是,我的代码创建的 DataTemplate 使用 FrameworkElementFactory 作为模板的 VisualTree,而 XAML 创建的模板使用 TemplateContent 对象作为模板的 Template 值。 我目前最好的判断是,所涉及的网格控件适用于使用 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?根据文档,没有公共API可用于此类型,实例化路径很复杂,但是否已实现?我找到的唯一示例在代码中使用硬编码的XAML,这让我感到不舒服。


1
具体是什么出了问题?模板没有被创建吗?名称没有被绑定找到吗? - CodeNaked
@CodeNaked:具体是什么问题我说不清楚;我已经联系了网格的开发人员,他们说他们已经找到了问题并正在解决,但如果可能的话,我宁愿不等他们。 - Adam Robinson
我的意思是,你看到了什么 :-) 你在网格中看到了EditorControl,但它不起作用吗?还是EditorControl根本没有显示出来? - CodeNaked
@代码:抱歉 ;) 无论我选择哪种方式,控件都会显示出来,但是使用上面的基于代码的模板代码时,值仅从底层对象中读取;尝试操作编辑器没有任何效果。如果我返回在XAML中初始化的属性的值,编辑器就会正常工作。 - Adam Robinson
1个回答

2
我也不喜欢这种做法,但实际上这是推荐的方法,在FrameworkElementFactory的文档中可以找到以下内容:

这个类是一种已弃用的编程方式来创建模板,这些模板是 FrameworkTemplate 的子类,例如 ControlTemplate 或 DataTemplate;当您使用此类创建模板时,并非所有的模板功能都可用。编程创建模板的推荐方式是使用 XamlReader 类的 Load 方法从字符串或内存流中加载 XAML。

我不知道在代码中使用 Template 属性的简单方法,据我所知,唯一可能的方法是通过 大量 反射。
设置名称是一个特殊情况,如果你设置了工厂的Name属性,它应该被正确注册,否则你需要获取适当的Namescope并手动注册名称。

你如何在DataTemplate中注册一个对象的名称,因为该对象尚未创建? :-) - CodeNaked
@CodeNaked:确实,那需要使用一些“Loaded”事件或类似的东西。不过,到目前为止,使用FrameworkElementFactory.Name似乎对我有用。 - H.B.
呸,我真的很希望有某种秘密但功能强大的API可以让我以类型安全的方式完成这个任务。 - Adam Robinson

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