Итак, вот 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, поэтому шаблон = ItemTemplate
Группа 3: IsLeaf = false, поэтому template = GroupTemplate
И как только свойство 1 группы IsLeaf изменится на true, шаблон должен автоматически измениться на ItemTemplate.
EDIT:
Вот мое временное решение. Любой лучший способ сделать это?
<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>