Итак, вот мой XAML:
<ItemsControl ItemsSource="{Binding Path=Groups}" ItemTemplateSelector="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=ListTemplateSelector}"/>
Вот мой класс ListTemplateSelector:
public class ListTemplateSelector : DataTemplateSelector {
public DataTemplate GroupTemplate { get; set; }
public DataTemplate ItemTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container) {
GroupList<Person> list = item as GroupList<Person>;
if (list != null && !list.IsLeaf)
return GroupTemplate;
return ItemTemplate;
}
}
Шаблон данных GroupTemplate ссылается на ListTemplateSelector внутри себя, поэтому я настроил его так, как будто он настроен. Это единственный рекурсивный хак, который я мог собрать. Но затем' У меня не проблема.
Моя проблема в том, что я хочу изменить ItemTemplate на GroupTemplate при изменении свойства IsLeaf. Это прекрасно работает в первый раз, так как он читает свойство в первый раз. Но как только это свойство изменяется, селектор шаблона не применяется повторно. Теперь я мог бы использовать триггеры для привязки к значению и установить шаблон элемента соответствующим образом, но мне нужно иметь возможность устанавливать разные шаблоны для каждого элемента, так как они могут находиться в другом состоянии.
Например, скажем, я список групп выглядит следующим образом:
Группа 1: IsLeaf = false, поэтому template = GroupTemplate
Группа 2: IsLeaf = true, поэтому template = ItemTemplate
Группа 3: IsLeaf = false, поэтому template = GroupTemplate
И как только свойство IsLeaf группы 1 меняется на true, шаблон должен автоматически измениться на ItemTemplate.
РЕДАКТИРОВАТЬ:
Вот мое временное решение. Есть ли лучший способ сделать это?
<ItemsControl ItemsSource="{Binding Path=Groups}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding}">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{DynamicResource ItemTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsLeaf}" Value="False">
<Setter Property="ContentTemplate" Value="{DynamicResource GroupTemplate}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Что касается EDIT, разве не будет достаточно триггера DataTemplate вместо использования стиля? То есть:
<ItemsControl ItemsSource="{Binding Path=Groups}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl x:Name="cc" Content="{Binding}" ContentTemplate="{DynamicResource ItemTemplate}"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsLeaf}" Value="False">
<Setter TargetName="cc" Property="ContentTemplate" Value="{DynamicResource GroupTemplate}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>