Переопределение шаблона по умолчанию для определенных узлов в базе данных (XML / XPath) TreeView - PullRequest
1 голос
/ 26 сентября 2011

TL; DR заранее: я хотел бы использовать HierarchicalDataTemplate «по умолчанию» для всех, кроме определенных нескольких узлов в WPF TreeView.Эти узлы происходят из XMLDocument и не полностью известны до времени выполнения.Есть ли способ сделать это?

Во время выполнения я анализирую определенные части системы и создаю документ XML, который затем привязываю к TreeView следующим образом:

MyTree.DataContext = MyXMLDocument;

Это мое объявление WPF для TreeView:

<TreeView x:Name="MyTree" ItemsSource="{Binding Mode=OneWay, XPath=/Analysis}" ItemTemplate="{StaticResource GenericElementWithChildren}"/>

Шаблон начинается следующим образом ...

<HierarchicalDataTemplate x:Key="GenericElementWithChildren" ItemsSource="{Binding XPath=child::node()}">

Так, например, у меня может быть какой-то длинный XML-документ о разныхаспекты анализа, которые я только что выполнил, и я бы хотел, чтобы какой-то конкретный элемент, такой как «Диск» или «Собственная служба Foo», имел специальный шаблон, потому что он должен отображаться красиво, а все остальное просто получает общий шаблон.

Я думал об использовании DataTemplateSelector, но похоже, что должен быть лучший способ.Я даже не уверен, как бы я это сделал для XML.У кого-нибудь из умных людей есть какая-то мудрость, или я застрял, пытаясь понять, как написать DataTemplateSelector против XML?

1 Ответ

1 голос
/ 26 сентября 2011

DataTemplate и HierarchicalDataTemplate также имеют свойство DataType.Когда вы удаляете x:Key и предоставляете DataType, эти шаблоны неявны.Таким образом, вы можете определить свои различные шаблоны как неявные, и они будут использоваться автоматически, если вы не предоставите ItemTemplate или ItemTemplateSelector для начального TreeView.

<HierachicalDataTemplate DataType="{x:Type ProprietaryFooService}">

Лично я стараюсь избегать этого, потому что это также означает, что другие элементы управления, которые могут показать ваши данные, также используют эти шаблоны.По моему мнению, лучше всего было бы использовать DataTemplateSelector, особенно когда вы имеете дело с одними и теми же типами, которые вам нужно показывать по-разному.

Редактировать: Извините, я пропустил, что вы используетеXpath.Я думаю, это не будет работать там.Я оставлю этот ответ здесь, но не могу гарантировать, что он соответствует вашим потребностям.Может быть, в любом случае это поможет.

...