WPF: повторно применить DataTemplateSelector при изменении определенного значения

Итак, вот мой 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>
27
задан Nick 22 August 2010 в 21:41
поделиться

1 ответ

Что касается 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>
22
ответ дан 28 November 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: