WPF: Groupstyle не работи правилно поради стил и/или модифицирано 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>

Използване на 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