8 c# collections wpf grouping listbox
有时WPF对我来说太复杂了.我的"Window1"收藏了一组"群组"."Group"是一个带有"Person"集合的类.最后,这应该是联系人列表.我只想在ListBox中显示其人员组,其中列表组的组名称等于我的类"Groups"的Name属性.
我试过将CollectionViewSource绑定到"Collection".组显示正确,但列表中的项目等于组名称.因此每个组只有一个项目:组名.
这里的许多示例显示仅具有一个集合的项目分组.我能做的是将组名设置为"人物"的属性.但后来我无法计算(这真的是必要的): - 每组中有多少人 - 有多少人拥有"状态""在线".
我在"Group"类中使用linq来计算它.感谢您提供帮助我开始的任何建议.
idu*_*sun 21
好吧,我不确定这是否是您想要实现的目标,但这是一种可以尝试的方法:
假设你的课程是这样的:
public class Group
{
public string Name { get; set; }
public List<Contact> Contacts { get; set; }
}
public class Contact
{
public string Name { get; set; }
public bool IsOnline { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
您可以将ListBox.ItemTemplate另一个ListBox绑定设置为Contacts属性,例如:
<CollectionViewSource x:Key="groups" Source="{Binding}" >
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Name" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
<DataTemplate x:Key="groupTemplate" DataType="Group">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
<ListBox ItemsSource="{Binding Source={StaticResource groups}}">
<ListBox.GroupStyle>
<GroupStyle HeaderTemplate="{StaticResource groupTemplate}" />
</ListBox.GroupStyle>
<ListBox.ItemTemplate>
<DataTemplate DataType="Contact">
<ListBox ItemsSource="{Binding Contacts}">
<ListBox.ItemTemplate>
<DataTemplate DataType="Contact">
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
你必须稍微调整内部列表框的样式.
编辑:使用的另一个解决方案TreeView
<DataTemplate DataType="Contact">
<TextBlock Text="{Binding Name}" />
</DataTemplate>
<TreeView ItemsSource="{Binding Source={StaticResource groups}}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="Group" ItemsSource="{Binding Contacts}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Run Code Online (Sandbox Code Playgroud)
如果你有一个编程WPF的副本,请跳转到第221页.如果不是,我将总结(以我的无能为力的方式)
首先,您不需要手动对Person对象进行分组.
如果每个Person对象都有一个Group属性,
People people = // retrieve the List<Person> somehow
ICollectionView view = CollectionViewSource.GetDefaultView(people);
view.GroupDescriptions.Add( new PropertyGroupDescription("Group") );
Run Code Online (Sandbox Code Playgroud)
从ItemsControl派生的所有控件都可以显示分组的项目,因此
// the XAML
<ListBox ... ItemsSource={Binding}>
<ListBox.GroupStyle>
<x:Static Member="GroupStyle.Default" />
</ListBox.GroupStyle>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
您也可以自定义一个GroupStyle并指定GroupStyle.HeaderTemplate定义一个新的DataTemplate,显示自定义属性,如"一些的PropertyValue(计数)" -绑定一个的TextBlock到{Binding SomeProperty}与另{Binding ItemCount}
HTH