有时候WPF对我来说太复杂了。我的“Window1”收藏了一组“群组”。 “Group”是一个带有“Person”集合的类。最后,这应该是联系人列表。我只想在ListBox中显示其人员组,其中列表组的组名称等于我的班级“组”的名称属性。
我尝试过将CollectionViewSource绑定到“Collection”。组显示正确,但列表中的项目等于组名称。因此每个组只有一个项目:组名。
此处的许多示例显示仅包含一个集合的项目分组。我能做的是将组名设置为“人物”的属性。但后来我无法计算(这真的是必要的): - 每组中有多少人 - 有多少人拥有“状态”“在线”。
我在“Group”类中使用linq来计算它。 感谢任何帮助我开始的建议。
答案 0 :(得分: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; }
}
您可以将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>
你必须对内部列表框进行一些设计。
修改:使用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>
答案 1 :(得分:8)
如果你有Programming WPF的副本,请跳转到第221页。如果不是,我会总结(以我的无能为力)
首先,您不需要手动对Person对象进行分组。
如果每个Person对象都有一个Group属性,
People people = // retrieve the List<Person> somehow
ICollectionView view = CollectionViewSource.GetDefaultView(people);
view.GroupDescriptions.Add( new PropertyGroupDescription("Group") );
从ItemsControl派生的所有控件都可以显示分组的项目,所以
// the XAML
<ListBox ... ItemsSource={Binding}>
<ListBox.GroupStyle>
<x:Static Member="GroupStyle.Default" />
</ListBox.GroupStyle>
</ListBox>
您还可以定义自定义GroupStyle并指定GroupStyle.HeaderTemplate以定义显示自定义属性的新DataTemplate,例如'some PropertyValue(Count)' - 将一个TextBlock绑定到{Binding SomeProperty}
,将另一个绑定到{{ 1}}
HTH