Любой способ использовать интерфейсы с wpf HierarchicalDataTemplate - PullRequest
2 голосов
/ 26 декабря 2010

Привет! Я использую интерфейс IFooNode, который является частью дерева.
Я хотел отобразить это дерево в TreeView, используя HierarchicalDataTemplate.Это, однако, не работает из-за интерфейса.Я вижу два пути, которые я бы не назвал «хорошими»

  1. Узнайте, какой тип действительно реализует IFooNode (давайте назовем его FooNode ...), затем найдите сборку, определяющую FooNodeдобавьте ссылку на эту сборку и создайте HierarchicalDataTemplate для FooNode (в надежде, что класс реализации никогда не изменится ...)

  2. Написать класс MyCoolIFooNodeWrapperForWpf, который оборачивает IFooNode, не привязывать к дереву, но заполните список MyCoolIFooNodeWrapperForWpf из корня дерева и создайте HierarchicalDataTemplate для MyCoolIFooNodeWrapperForWpf.

Можно ли как-нибудь всегда применять тип данных HierarchicalDataTemplate, независимо от того, какой(Это, я думаю, было бы меньшим злом ...)

Любые другие идеи?

Ответы [ 2 ]

2 голосов
/ 26 декабря 2010

Вы можете использовать ItemTemplateSelector. В коде селектора вы можете проверить, какой интерфейс реализует ваш объект данных, и выбрать соответствующий DataTemplate / HeirarchicalDataTemplate для этого элемента.

Селектор может применяться как к самому контейнеру (ItemsControl.ItemTemplateSelector), так и к шаблону иерархических данных (HeirarchicalDataTemplate.ItemTemplateSelector).

Я думаю, что это меньшее зло.

0 голосов
/ 27 декабря 2010

Если вы не выбираете из нескольких шаблонов, вам не нужно указывать тип данных в шаблоне. Если все объекты в вашем дереве реализуют ваш интерфейс, просто вставьте шаблон, используя свойства этого интерфейса, и все готово. Вам не нужно ничего делать в шаблоне, чтобы сделать его специфичным для этого интерфейса.

Если по какой-то причине вам нужно сделать выбор шаблона на основе того, какой интерфейс поддерживает объект, вам нужно реализовать селектор шаблона и решить проблему «многие к одному», которая мешает встроенному в WPF механизму выбора шаблона. от использования интерфейсов в первую очередь. (То есть, если у вас есть шаблон для IFoo и один для IBar, какой шаблон вы используете для объекта, который поддерживает IFoo и IBar?)

...