ListBox分组问题

时间:2014-02-17 17:46:55

标签: wpf listbox itemscontrol

我正在尝试根据以下模型对我的收藏进行分组:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Role PersonRole { get; set; }
}

public class Role
{
    public int Id { get; set; }
    public string RoleName { get; set; }
}

我的PersonCollection,

public ObservableCollection<Person> PersonList;

该集合中填充了三个Person对象,其中两个具有相同的角色。

我想按照他们的角色名称对所有人进行分组。我有以下XAML:

<Grid.Resources>

        <CollectionViewSource x:Key="cvs" Source="{Binding PersonList}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="PersonRole.RoleName"/>
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>

    </Grid.Resources>

<ListBox ItemsSource="{Binding Source={StaticResource cvs}}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding FirstName}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding PersonRole.RoleName}" FontWeight="Bold" Background="ForestGreen" Margin="0,5,0,0"/>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
        </ListBox.GroupStyle>
    </ListBox>

但是,渲染的UI未在列表框中显示已分组的RoleName。此外,我想水平分组显示组水平显示,而分组项目垂直显示。提前感谢任何帮助。

这是我看到的输出: enter image description here

1 个答案:

答案 0 :(得分:20)

由于您已在CollectionViewSource中提供了GroupDescriptons,因此groupStyle将仅从那里选择属性名称。

您只需绑定NameCollectionViewGroup属性即可访问应用分组的属性值。在组样式中,绑定是针对CollectionViewGroup类的,而不是针对您的Model类。

所以,这就是你要做的事情:

<TextBlock Text="{Binding Name}" FontWeight="Bold"
           Background="ForestGreen" Margin="0,5,0,0"/>

关于水平对齐群组,您可以将群组ItemsPanelTemplate设置为VirtualizingStackPanelOrientation设置为Horizontal,这样您的群组就会水平对齐。< / p>

<ListBox.GroupStyle>
   <GroupStyle>
      <GroupStyle.Panel>
         <ItemsPanelTemplate>
           <VirtualizingStackPanel Orientation="Horizontal"/>
         </ItemsPanelTemplate>
      </GroupStyle.Panel>
      <GroupStyle.HeaderTemplate>
        <DataTemplate>
           <TextBlock Text="{Binding Name}" FontWeight="Bold"
                      Background="ForestGreen" Margin="0,5,0,0"/>
         </DataTemplate>
      </GroupStyle.HeaderTemplate>
   </GroupStyle>
</ListBox.GroupStyle>