WPF: применять несколько шаблонов данных? - PullRequest
0 голосов
/ 08 октября 2011

Допустим, я отображаю компонент данных, такой как TreeView.

Допустим, он связан с древовидной структурой базового типа TreeViewItem.

TreeViewItem
    TreeViewItem
    TreeViewItem
        TreeViewItem

и так далее.

Но некоторые из этих элементов являются более конкретными реализациями TreeViewItem, такими как AnimalTreeViewItem и еще более детализированными ZebraTreeViewItem

TreeViewItem
    AnimalTreeViewItem
        ZebraTreeViewItem
    PlantTreeViewItem

Теперь, допустим, я хочу, чтобы эти элементы отображались аналогичным образом,но будут небольшие различия в рендеринге в зависимости от базового типа

Один из способов заставить это работать - использовать DataTemplate.

Проблема в том, что мне нужно создать отдельный шаблон для каждого типа, с одинаковым определением 100% содержимого (за исключением небольшой разницы в разметке / цвете и т. Д.)

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

Ответы [ 2 ]

1 голос
/ 08 октября 2011

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

0 голосов
/ 07 июня 2013

Ответ на этот вопрос: DataTriggers

<DataTemplate x:Key="myTaskTemplate">
  ...
<DataTemplate.Triggers>
  <DataTrigger Binding="{Binding Path=TaskType}">
    <DataTrigger.Value>
      <local:TaskType>Home</local:TaskType>
    </DataTrigger.Value>
    <Setter TargetName="border" Property="BorderBrush" Value="Yellow"/>
  </DataTrigger>
</DataTemplate.Triggers>
  ...
</DataTemplate>

Этот шаблон данных будет «срабатывать» только тогда, когда TaskType имеет значение Home.

http://msdn.microsoft.com/en-us/library/ms742521.aspx#adding_more_to_datatemplate

...