WPF:将Collection与Collection绑定到带有组的ListBox

有时候WPF对我来说太复杂了。 我的“Window1”collections了一组“群组”。 “Group”是一个包含“Person”集合的类。 最后,这应该是联系人列表。 我只想在ListBox中显示其人员组,其中列表组的组名称等于我的类“Groups”的Name属性。

我试过将CollectionViewSource绑定到“Collection”。 这些组显示正确,但列表中的项目等于组名称。 因此每个组只有一个项目:组名。

这里的许多示例显示仅具有一个集合的项目分组。 我能做的是将组名设置为“人物”的属性。 但后来我无法计算(这是非常必要的): – 每组中有多少人 – 有多少人拥有“状态”“在线”。

我在“Group”类中使用linq来计算它。 感谢您提供帮助我入门的任何建议。

好吧,我不确定这是否是您想要实现的目标,但这是一种可以尝试的方法:

假设你的课程是这样的:

public class Group { public string Name { get; set; } public List Contacts { get; set; } } public class Contact { public string Name { get; set; } public bool IsOnline { get; set; } } 

您可以将ListBox.ItemTemplate设置为另一个ListBox绑定到Contacts属性,如:

                           

你必须设计内部列表框的样式。

编辑 :使用TreeView另一种解决方案

           

如果您有一个编程WPF的副本,请跳转到第221页。如果不是,我将总结(以我的无能为力的方式)

首先,您不需要手动对Person对象进行分组。

如果每个Person对象都有一个Group属性,

 People people = // retrieve the List somehow ICollectionView view = CollectionViewSource.GetDefaultView(people); view.GroupDescriptions.Add( new PropertyGroupDescription("Group") ); 

从ItemsControl派生的所有控件都可以显示分组的项目,因此

 // the XAML      

您还可以定义自定义GroupStyle并指定GroupStyle.HeaderTemplate以定义显示自定义属性的新DataTemplate,例如’some PropertyValue(Count)’ – 将一个TextBlock {Binding SomeProperty}{Binding ItemCount} ,将另一个{Binding ItemCount}{Binding ItemCount}

HTH