Любой способ использовать интерфейсы с wpf HierarchicalDataTemplate

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

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

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

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

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

2 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам