DataTemplate, созданный с использованием XamlReader.Parse, не имеет своего свойства DataTemplateKey - почему бы и нет? - PullRequest
1 голос
/ 16 марта 2019

Допустим, у меня есть простое объявление 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();
    }

Я хочу загрузить это в ресурсы моего MainWindow, используя XamlReader.Parse для сгенерированной строки XAML.

    public MainWindow()
    {
        InitializeComponent();

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

Это выполняется без исключения, но результирующий DataTemplate не имеет своего свойства DataTemplateKey (он имеет значение null). Я ожидаю, что это будет иметь значение «myListBoxItemTemplate». Итак, если я хочу добавить этот шаблон к ресурсам MainWindow, мне нужно снова явно обратиться к ключу (который выглядит избыточным):

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

Почему dataTemplate.DataTemplateKey имеет значение null после загрузки действительного XAML, который определяет этот ключ?

(У меня есть более серьезные проблемы, с которыми я сталкиваюсь, но это может подсказать мне, почему это также происходит.)

1 Ответ

1 голос
/ 16 марта 2019

Установка x:Key не устанавливает свойство DataTemplateKey DataTemplate.

Это наоборот.См. Замечания :

Если вы не зададите директиву x: Key для DataTemplate, находящегося в ResourceDictionary, в качестве ключа используется DataTemplateKey.

...