Добавление DataTemplate (не XAML) в словарь ресурсов в коде?

StackOverflow https://stackoverflow.com/questions/1949929

Вопрос

Я пытаюсь выяснить, как добавить 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 напрямую.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top