列表框分组 WPF

Dyl*_*lan 1 c# wpf xaml wpf-controls

我正在尝试对列表框进行分组。我所能显示的就是标题。

我有一个 'Online Users' 列表,看起来像这样。

public class OnlineUser{
  public string Branch {get;set;}
  public string FirstName{get;set;}
  public string LastName{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

然后我用一些用户填充列表,并将该列表放入 ICollectionView 'FilterableOnlineUsers'

FilterableOnlineUsers = CollectionViewSource.GetDefaultView(OnlineUsers);
FilterableOnlineUsers.GroupDescriptions.Add(new PropertyGroupDescription("Branch"));
FilterableOnlineUsers.SortDescriptions.Add(new SortDescription("Branch", ListSortDirection.Descending));
Run Code Online (Sandbox Code Playgroud)

在我的 Xaml 中:

<ListBox  SelectedItem="{Binding DataContext.SelectedUser" ItemsSource="{Binding DataContext.FilterableOnlineUsers" >
<ListBox.GroupStyle>
    <GroupStyle />
</ListBox.GroupStyle>
<ListBox.ItemTemplate>
    <DataTemplate>
         <StackPanel Orientation="Horizontal">
            <TextBlock>
                <TextBlock.Text>
                    <MultiBinding StringFormat="{}{0} {1}">
                         <Binding Path="FirstName"></Binding>
                        <Binding Path="LastName"></Binding>
                    </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </StackPanel>
    </DataTemplate>
 </ListBox.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)

我能在列表框中显示的只是分支名称。我无法让名字或姓氏显示在组描述下方。

谢谢。

Abi*_*hew 7

您应该CollectionViewSource在如下所示的XAML资源中定义一个,并将ItemsSource设置设置为CollectionViewSource

<CollectionViewSource x:Key="ListBoxItems" Source="{Binding Path=ListOfOnlineUser}">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="Branch" />
        </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
Run Code Online (Sandbox Code Playgroud)

在列表框中

 <ListBox ItemsSource="{Binding Source={StaticResource ListBoxItems}}"/>
Run Code Online (Sandbox Code Playgroud)

详细信息 下面是 ListBox 显示分组分支,每个分支都在一个扩展器内,您可以折叠和展开每个组。

    <ListBox
        Margin="0,0,5,0"
        ItemsSource="{Binding Source={StaticResource ListBoxItems}}"
        SelectedIndex="-1"
        SelectedItem="{Binding SelectedBranch}">            
        <ListBox.GroupStyle>
            <GroupStyle>
                <GroupStyle.Panel>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel Orientation="Vertical" />
                    </ItemsPanelTemplate>
                </GroupStyle.Panel>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <Expander
                                        Padding="0"                                           
                                        BorderThickness="0"
                                        Header="{Binding Name}"
                                        IsExpanded="True">
                                        <ItemsPresenter/>
                                    </Expander>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </ListBox.GroupStyle>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Border BorderThickness="0">
                    <Grid>                            
                        <StackPanel Orientation="Horizontal">                               
                            <TextBlock Text="{Binding FirstName}" />
                            <TextBlock Text="{Binding LastName}" />
                        </StackPanel>                            
                    </Grid>
                </Border>
            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Padding" Value="0" />
                <Setter Property="Margin" Value="0" />
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>
Run Code Online (Sandbox Code Playgroud)