Допустим, у меня есть простое объявление 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, который определяет этот ключ?
(У меня есть более серьезные проблемы, с которыми я сталкиваюсь, но это может подсказать мне, почему это также происходит.)