我正在尝试使用DataTemplateSelector
与特定的第三方WPF网格控件,我无法确定我遇到的问题是否是控制中的错误或我自己的缺乏了解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
?根据{{3}},这种类型没有公共API,实例化路径很复杂,但这已经完成了吗?我发现的唯一the documentation在代码中使用了硬编码的XAML,这对我来说并不合适。
答案 0 :(得分:2)
我不喜欢这种做事方式,但这实际上是推荐的方式,在FrameworkElementFactory
的文档中可以找到以下内容:
这个类是一种不常用的方式,以编程方式创建模板,模板是FrameworkTemplate的子类,如ControlTemplate或DataTemplate;使用此类创建模板时,并非所有模板功能都可用。以编程方式创建模板的推荐方法是使用XamlReader类的Load方法从字符串或内存流加载XAML。
我不知道在代码中使用Template
属性的任何简单方法,我可能知道的唯一方法是通过反射很多。
设置名称是一种特殊情况,如果您设置工厂的Name
属性,则应正确注册,如果不是,则需要获取合适的Namescope
和register名称手动