Добавление DataTemplate (не XAML) в словарь ресурсов в коде? - PullRequest
4 голосов
/ 23 декабря 2009

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

1 Ответ

2 голосов
/ 23 декабря 2009

Для правильной работы здесь необходимо использовать DataTemplateKey :

ResourceDictionary dictionary = new ResourceDictionary();
dictionary.Add(new DataTemplateKey(typeof(CoordinateViewModel)), template);

Если вы сделаете это, оно должно работать как указано. Однако FrameworkElementFactory , согласно документам, является "устаревшим способом программного создания шаблонов", поэтому вы можете захотеть проанализировать XAML напрямую.

...