Любой способ использовать интерфейсы с wpf HierarchicalDataTemplate
Привет, я использую интерфейс IFooNode, который является частью дерева.
Я хотел отобразить это дерево в TreeView, используя HierarchicalDataTemplate. Это, однако, не работает из-за интерфейса. Я вижу два пути, которые я бы назвал "хорошими"
Узнайте, какой тип действительно реализует IFooNode (назовем его FooNode...), затем найдите сборку, определяющую FooNode, добавьте ссылку на эту сборку и создайте HierarchicalDataTemplate для FooNode (надеясь, что класс Implementating никогда не изменится...)
Напишите класс MyCoolIFooNodeWrapperForWpf, который оборачивает IFooNode, не привязывайте к дереву, а заполните список MyCoolIFooNodeWrapperForWpf из корня дерева и создайте шаблон HierarchicalDataTemplate для MyCoolIFooNodeWrapperForWpf.
Могу ли я как-то всегда применять HierarchicalDataTemplate, независимо от того, какого типа данные (это, я думаю, было бы меньшим злом...)
Любые другие идеи?
2 ответа
Вы можете использовать ItemTemplateSelector. В коде селектора вы можете проверить, какой интерфейс реализует ваш объект данных, и выбрать соответствующий DataTemplate/HeirarchicalDataTemplate для этого элемента.
Селектор может применяться как к самому контейнеру (ItemsControl.ItemTemplateSelector), так и к вашему шаблону иерархических данных (HeirarchicalDataTemplate.ItemTemplateSelector).
Я думаю, что это меньшее зло.
Если вы не выбираете из нескольких шаблонов, вам не нужно указывать тип данных в шаблоне. Если все объекты в вашем дереве реализуют ваш интерфейс, просто вставьте шаблон, используя свойства этого интерфейса, и все готово. Вам не нужно ничего делать в шаблоне, чтобы сделать его специфичным для этого интерфейса.
Если по какой-то причине вам нужно сделать выбор шаблона на основе того, какой интерфейс поддерживает объект, вам нужно реализовать селектор шаблона и решить проблему "многие к одному", которая не позволяет встроенному в WPF механизму выбора шаблона использовать интерфейсы. на первом месте. (То есть, если у вас есть шаблон для IFoo
и один для IBar
какой шаблон вы используете для объекта, который поддерживает IFoo
а также IBar
?)