Так вот XAML, что у меня есть:WPF: Повторно DataTemplateSelector, когда определенное значение изменяется
<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 = ложь, поэтому шаблон = GroupTemplate
Группа 2: IsLeaf = верно, так что шаблон = ItemTemplate
Группа 3: IsLeaf = ложь, поэтому шаблон = GroupTemplate
И когда изменения свойств 1-й группы в IsLeaf к истинным, templat e необходимо автоматически переключиться на 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>
Для ясности вы отбросили подход DataTemplateSelector в пользу триггеров, или вы тоже работали с триггерами в решении с помощью DataTemplateSelector? – alastairs
@alastairs Я не могу говорить для OP, но триггеры, похоже, не делают DataTemplateSelector ненужным. – piedar