C# WPF:将具有集合的集合绑定到具有组的列表框

C# WPF:将具有集合的集合绑定到具有组的列表框,c#,wpf,listbox,grouping,collections,C#,Wpf,Listbox,Grouping,Collections,有时候WPF对我来说太复杂了。我的“窗口1”中有一组“组”的集合。“Group”是一个包含“Person”集合的类。最后,这应该是一个联系人列表。我只想在列表框中显示这些组及其人员,其中列表组的组名等于我的类“groups”的name属性 我已尝试使用绑定到“集合”的CollectionViewSource。组显示正确,但列表中的项目与组名相同。因此,每个组只有一个项:其组名 这里的许多示例显示仅使用一个集合对项目进行分组。我能做的是将组名设置为“Person”的属性。但是我不能数数(这是非常必

有时候WPF对我来说太复杂了。我的“窗口1”中有一组“组”的集合。“Group”是一个包含“Person”集合的类。最后,这应该是一个联系人列表。我只想在列表框中显示这些组及其人员,其中列表组的组名等于我的类“groups”的name属性

我已尝试使用绑定到“集合”的CollectionViewSource。组显示正确,但列表中的项目与组名相同。因此,每个组只有一个项:其组名

这里的许多示例显示仅使用一个集合对项目进行分组。我能做的是将组名设置为“Person”的属性。但是我不能数数(这是非常必要的): -每组有多少人 -其中有多少人具有“在线”状态

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

如果您有一份,请跳到第221页。如果不是的话,我将(以我笨拙的方式)总结

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

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

People people = // retrieve the List<Person> somehow
ICollectionView view = CollectionViewSource.GetDefaultView(people);
view.GroupDescriptions.Add( new PropertyGroupDescription("Group") );
People=//以某种方式检索列表
ICollectionView=CollectionViewSource.GetDefaultView(人员);
view.GroupDescriptions.Add(新属性GroupDescription(“组”));
从ItemsControl派生的所有控件都可以显示分组的项,因此

// the XAML
<ListBox ... ItemsSource={Binding}>
  <ListBox.GroupStyle>
    <x:Static Member="GroupStyle.Default" />
  </ListBox.GroupStyle>
</ListBox>
//XAML
您还可以定义自定义GroupStyle并指定GroupStyle.HeaderTemplate以定义新的数据模板,该模板显示自定义属性,如“some PropertyValue(Count)”-将一个文本块绑定到
{Binding SomeProperty}
,将另一个绑定到
{Binding ItemCount}


HTH

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

假设您的类如下所示:

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; }
}
您必须稍微设置内部列表框的样式

编辑:使用
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>


首先谢谢。My Person对象还没有组属性。我想避免它。我不明白如何处理计数(只有逻辑,TextBlock的事实是清楚的)。这里有一些代码,如果它能帮助你的话。enum OnlineStatus{ONLINE,OFFLINE}class Person{//每个组的标题应计算//有多少人具有OnlineStatus“ONLINE”。公共OnlineStatus状态{get;set;}}类组{public List Persons=new List();}类窗口1{public List Groups=new List;}+1,
{Binding ItemCount}
是我需要的答案!非常感谢。这是一个非常有用的解决方案,与我以前的解决方案相同,在我以前的解决方案中,每个组都有一个扩展器,每个联系人都有一个列表框。这里的问题是,你可以在每个列表中选择一个人,但我想你可以用一个人来做。我尝试复制Windows Live Messenger 2009联系人列表的用户界面。我认为他们只使用了一个列表框和一个扩展器作为组的控制模板。但我也假设,他们将集团定义为财产。但我真的不知道,他们怎么能算出上网人数。顺便说一句,你的类是对的。为什么不使用TreeView控件来显示分层数据呢?你完全正确!我想,这肯定会解决我的问题。“为什么”我没有答案。我很少使用TreeView控件。但这对解决我的问题是最好的。谢谢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>