C# WPF:将具有集合的集合绑定到具有组的列表框
有时候WPF对我来说太复杂了。我的“窗口1”中有一组“组”的集合。“Group”是一个包含“Person”集合的类。最后,这应该是一个联系人列表。我只想在列表框中显示这些组及其人员,其中列表组的组名等于我的类“groups”的name属性 我已尝试使用绑定到“集合”的CollectionViewSource。组显示正确,但列表中的项目与组名相同。因此,每个组只有一个项:其组名 这里的许多示例显示仅使用一个集合对项目进行分组。我能做的是将组名设置为“Person”的属性。但是我不能数数(这是非常必要的): -每组有多少人 -其中有多少人具有“在线”状态 我在“组”类中使用linq来计算。 感谢您提供的任何帮助我入门的建议。如果您有一份,请跳到第221页。如果不是的话,我将(以我笨拙的方式)总结 首先,您不需要手动分组Person对象 如果每个Person对象都有一个组属性C# WPF:将具有集合的集合绑定到具有组的列表框,c#,wpf,listbox,grouping,collections,C#,Wpf,Listbox,Grouping,Collections,有时候WPF对我来说太复杂了。我的“窗口1”中有一组“组”的集合。“Group”是一个包含“Person”集合的类。最后,这应该是一个联系人列表。我只想在列表框中显示这些组及其人员,其中列表组的组名等于我的类“groups”的name属性 我已尝试使用绑定到“集合”的CollectionViewSource。组显示正确,但列表中的项目与组名相同。因此,每个组只有一个项:其组名 这里的许多示例显示仅使用一个集合对项目进行分组。我能做的是将组名设置为“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>