Добавление DataTemplate (не XAML) в словарь ресурсов в коде?
-
21-09-2019 - |
Вопрос
Я пытаюсь выяснить, как добавить DataTemplate в словарь ресурсов приложения.Я знаком с тем, как это сделать, когда DataTemplate находится в XAML (через uri), но я немного не понимаю, как это сделать, когда DataTemplate определен в коде.
То, что у меня есть, что не работает, это-
//Create DataTemplate
DataTemplate template = new DataTemplate(typeof(CoordinateViewModel));
FrameworkElementFactory ViewStack = new FrameworkElementFactory(typeof(CoordinateView));
ViewStack.Name = "myViewStack";
template.VisualTree = ViewStack;
ResourceDictionary dictionary = new ResourceDictionary();
dictionary.BeginInit();
dictionary.Add(template, template);
dictionary.EndInit();
App.Current.Resources.MergedDictionaries.Add(dictionary);
Редактировать:Насколько я могу, DataTemplate не попадает в словарь ресурсов приложения, несмотря на то, что не выдает никаких ошибок.Когда ViewModel позже вызывается из XAML, он действует так, как будто для его отображения нет подходящей DataTemplate.Например,
<StackPanel>
<ContentPresenter Content="{Binding ViewModel}" />
</StackPanel>
В результате появляется пустое окно с текстом "ShellPrototype.ViewModels.Отображается CoordinateViewModel" - НАПРИМЕР, у него нет шаблона для отображения представления.
Решение
Ключевым моментом здесь, для того чтобы заставить это работать правильно, является использование DataTemplateKey Параметр DataTemplateKey:
ResourceDictionary dictionary = new ResourceDictionary();
dictionary.Add(new DataTemplateKey(typeof(CoordinateViewModel)), template);
Если вы сделаете это, все должно работать так, как указано.Однако, в Каркасная элементная фабрика согласно документам, это "устаревший способ программного создания шаблонов", поэтому вы можете захотеть проанализировать XAML напрямую.