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

时间:2011-08-02 16:22:15

标签: c# wpf xaml datatemplate

我正在尝试使用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,这对我来说并不合适。

1 个答案:

答案 0 :(得分:2)

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

  

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

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


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