使用XamlReader.Parse创建的DataTemplate没有设置其DataTemplateKey属性-为什么不这样做?

时间:2019-03-16 19:51:59

标签: c# wpf xaml datatemplate

假设我有一个简单的DataTemplate声明;它甚至不需要内容:

<DataTemplate x:Key="myListBoxItemTemplate" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" />

..由以下C#代码生成:

    private string GenerateDataTemplateXaml()
    {
        const string xamlNamespaceString = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
        const string xamlXNamespaceString = "http://schemas.microsoft.com/winfx/2006/xaml";
        XNamespace defaultNamespace = xamlNamespaceString;
        XNamespace x = xamlXNamespaceString;

        XElement dataTemplate =
            new XElement(defaultNamespace + "DataTemplate",
                new XAttribute(x + "Key", "myListBoxItemTemplate"),
                new XAttribute(XNamespace.Xmlns + "x", xamlXNamespaceString),
                new XAttribute("xmlns", xamlNamespaceString));                   

        return dataTemplate.ToString();
    }

我想使用生成的XAML字符串上的XamlReader.Parse将其加载到MainWindow的资源中。

    public MainWindow()
    {
        InitializeComponent();

        string dataTemplateText = this.GenerateDataTemplateXaml();
        DataTemplate dataTemplate = (DataTemplate)XamlReader.Parse(dataTemplateText);
    }

这毫无例外地运行,但是生成的DataTemplate没有设置其DataTemplateKey属性(它为null)。我希望它的值为“ myListBoxItemTemplate”。因此,如果我想将此模板添加到MainWindow的资源中,则需要再次明确引用该键(这似乎是多余的):

this.Resources.Add("myListBoxItemTemplate", dataTemplate);

为什么在加载定义此密钥的有效XAML后dataTemplate.DataTemplateKey为null?

(我遇到了更大的问题,但这可能会提示我为什么也会发生这些问题。)

1 个答案:

答案 0 :(得分:1)

设置x:Key不会设置DataTemplate的DataTemplateKey属性。

反之亦然。参见Remarks

  

如果未在ResourceDictionary中的DataTemplate上设置x:Key指令,则将DataTemplateKey用作键。