我正在尝试根据以下模型对我的收藏进行分组:
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。此外,我想水平分组显示组水平显示,而分组项目垂直显示。提前感谢任何帮助。
这是我看到的输出:
答案 0 :(得分:20)
由于您已在CollectionViewSource中提供了GroupDescriptons
,因此groupStyle将仅从那里选择属性名称。
您只需绑定Name
类的CollectionViewGroup
属性即可访问应用分组的属性值。在组样式中,绑定是针对CollectionViewGroup类的,而不是针对您的Model类。
所以,这就是你要做的事情:
<TextBlock Text="{Binding Name}" FontWeight="Bold"
Background="ForestGreen" Margin="0,5,0,0"/>
关于水平对齐群组,您可以将群组ItemsPanelTemplate
设置为VirtualizingStackPanel
,Orientation
设置为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>