WPF: Groupstyle работает неправильно из-за Style и/или измененного ListBox

Я пытаюсь использовать GroupStyle, но вместо того, чтобы показывать имя группы в качестве заголовка над элементами в списке, он показывает только заголовок, а не элементы.

Он отлично работает, пока я не применил к списку особый стиль. Затем я решил, что этот стиль довольно фальшивый, поэтому я создал UserControl для этого эффекта. Проблема сохраняется.

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

Пользовательский контроль:

<UserControl x:Class="MyProject.CustomUC.ExpandingList"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">

    <Grid>
        <ListBox x:Name="List"
                 ItemsSource="{Binding Path=Collection}">
            <ListBox.Template>
                <ControlTemplate TargetType="ListBox">
                    <Border BorderBrush="Blue" 
                                    BorderThickness="1" 
                                    CornerRadius="2" 
                                    Background="White">
                        <ScrollViewer Focusable="False">
                            <StackPanel Margin="2" IsItemsHost="True" />
                        </ScrollViewer>
                    </Border>
                </ControlTemplate>
            </ListBox.Template>
            <ListBox.GroupStyle>
                <GroupStyle HidesIfEmpty="True">
                    <GroupStyle.HeaderTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=Name}"/>
                        </DataTemplate>
                    </GroupStyle.HeaderTemplate>
                </GroupStyle>
            </ListBox.GroupStyle>
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ListBoxItem">
                                <Border Margin="4" Name="Border" BorderBrush="Blue" BorderThickness="1" CornerRadius="5" Background="LightBlue">
                                    <Grid>
                                        <Grid.RowDefinitions>
                                            <RowDefinition />
                                            <RowDefinition />
                                        </Grid.RowDefinitions>
                                        <ContentPresenter Name="Head"
                                                          Margin="4"
                                                      Visibility="Visible"
                                                      ContentTemplate="{Binding ElementName=List, Path=DataContext.HeadTemplate}"/>
                                        <Border Name="Tail" Visibility="Collapsed" Grid.Row="1" BorderThickness="0,1,0,0" BorderBrush="Blue">
                                        <ContentPresenter Margin="4"
                                                      ContentTemplate="{Binding ElementName=List, Path=DataContext.TailTemplate}" />
                                        </Border>
                                    </Grid>
                                </Border>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsSelected" Value="True">
                                        <Setter TargetName="Tail" Property="Visibility" Value="Visible" />
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.ItemContainerStyle>
        </ListBox>
    </Grid>
</UserControl>

Использование пользовательского контроля:

<CustomUC:ExpandingList Collection="{Binding Path=List}">
    <CustomUC:ExpandingList.HeadTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=DisplayName}" />
        </DataTemplate>
    </CustomUC:ExpandingList.HeadTemplate>
    <CustomUC:ExpandingList.TailTemplate>
        <DataTemplate DataType="{x:Type ViewModel:ElementViewModel}">
            <TextBlock Text="{Binding Path=SomeOtherProperties}" />
        </DataTemplate>
    </CustomUC:ExpandingList.TailTemplate>
</CustomUC:ExpandingList>

Это работает, если я перейду из ExpandingList UserCotnrol:

<ListView ItemsSource="{Binding Path=List}" >
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=DisplayName}" />
        </DataTemplate>
    </ListView.ItemTemplate>
    <ListView.GroupStyle>
        <GroupStyle HidesIfEmpty="True">
            <GroupStyle.HeaderTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=Name}"/>
                </DataTemplate>
            </GroupStyle.HeaderTemplate>
        </GroupStyle>
    </ListView.GroupStyle>
</ListView>

Кто-нибудь знает, что может быть не так?


person Ingó Vals    schedule 01.06.2011    source источник


Ответы (1)


В шаблоне ListBox замените:

<StackPanel Margin="2" IsItemsHost="True" />

с участием

<ItemsPresenter Margin="2" />

Класс ItemsPresenter имеет дополнительную логику для групп, которую вы потеряете, если будете напрямую использовать панель для отображения элементов.

person Julien Lebosquain    schedule 01.06.2011