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

8 c# collections wpf grouping listbox

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

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

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

我在"Group"类中使用linq来计算它.感谢您提供帮助我开始的任何建议.

idu*_*sun 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; }
}
Run Code Online (Sandbox Code Playgroud)

您可以将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>
Run Code Online (Sandbox Code Playgroud)

你必须稍微调整内部列表框的样式.

编辑:使用的另一个解决方案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>
Run Code Online (Sandbox Code Playgroud)


Gis*_*shu 8

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

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

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

People people = // retrieve the List<Person> somehow
ICollectionView view = CollectionViewSource.GetDefaultView(people);
view.GroupDescriptions.Add( new PropertyGroupDescription("Group") );
Run Code Online (Sandbox Code Playgroud)

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

// the XAML
<ListBox ... ItemsSource={Binding}>
  <ListBox.GroupStyle>
    <x:Static Member="GroupStyle.Default" />
  </ListBox.GroupStyle>
</ListBox>
Run Code Online (Sandbox Code Playgroud)

您也可以自定义一个GroupStyle并指定GroupStyle.HeaderTemplate定义一个新的DataTemplate,显示自定义属性,如"一些的PropertyValue(计数)" -绑定一个的TextBlock到{Binding SomeProperty}与另{Binding ItemCount}

HTH