WPF: Groupstyle not working correctly because of S

2019-05-13 16:38发布

I am trying to use a GroupStyle but instead of showing the groupname as a header over the items in the list it only shows the header and not the items.

It works fine until I applied a special style to the list. I then decided this style was pretty bogus so I created a UserControl fro this effect. The problem persists.

The purpose of the UserControl is to have a expending effect on the selected item where normally it could show some info and then more info when expanded.

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>

Using the 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>

This works if I change from the 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>

Anyone know what could be wrong?

1条回答
Luminary・发光体
2楼-- · 2019-05-13 17:09

In the ListBox template, replace:

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

with

<ItemsPresenter Margin="2" />

The ItemsPresenter class has extra logic for groups, that you lose if you're directly using a panel to display the items.

查看更多
登录 后发表回答