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

时间:2009-05-22 06:31:10

标签: c# wpf listbox grouping collections

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

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

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

我在“Group”类中使用linq来计算它。 感谢任何帮助我开始的建议。

2 个答案:

答案 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