WPF-显示多次相同组的分组集合视图

WPF-显示多次相同组的分组集合视图,wpf,xaml,data-binding,grouping,collectionview,Wpf,Xaml,Data Binding,Grouping,Collectionview,我对绑定到ItemsControl的CollectionView进行分组时遇到问题 在我的ViewModel中,我有多个组。一个组是一个人的集合,每个人都知道它属于哪个组。 请参见末尾的Group和Person类。 -我想做的是:我希望能够显示一组按组分组的人员。我想在视图中从一组人而不是一组人的集合中创建这些组。 -我是这样做的: 我有一个包含所有组中的每个人的列表,该列表称为Everyone,我有一个从每个人创建的集合视图,称为EveryoneGrouped。然后,我将从组创建的Proper

我对绑定到ItemsControl的CollectionView进行分组时遇到问题

在我的ViewModel中,我有多个组。一个组是一个人的集合,每个人都知道它属于哪个组。 请参见末尾的Group和Person类。 -我想做的是:我希望能够显示一组按组分组的人员。我想在视图中从一组人而不是一组人的集合中创建这些组。 -我是这样做的: 我有一个包含所有组中的每个人的列表,该列表称为Everyone,我有一个从每个人创建的集合视图,称为EveryoneGrouped。然后,我将从组创建的PropertyGroupDescription添加到EveryoneGrouped集合中。 -我的问题是: 组出现多次,事实上,组的出现次数与其包含的人数相同。 如果我有以下几组: -第一组[阿尔法一] -第二组[阿尔法二,贝塔二] -第三组[阿尔法三,贝塔三,伽马三] 它将产生以下结果: 第一组只出现一次,因为它只包含一个人。我希望第二组和第三组也只出现一次。 我只是不能指出我做错了什么,任何帮助都将不胜感激。 编辑:多个组或人员可以具有相同的名称。 以下是我的代码,它生成了上一个屏幕截图:

视图模型 人 组 谢谢。

按组的GroupName属性分组:

并显示组的名称:

<ItemsControl.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <TextBlock DockPanel.Dock="Left" FontWeight="Bold" Text="{Binding Name}" />
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
    </GroupStyle>
</ItemsControl.GroupStyle>
<ItemsControl.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <TextBlock DockPanel.Dock="Left" FontWeight="Bold" Text="{Binding Items[0].Group.GroupName}" />
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
    </GroupStyle>
</ItemsControl.GroupStyle>
并将TextBlock绑定到组中第一个项的组的GroupName属性:

<ItemsControl.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <TextBlock DockPanel.Dock="Left" FontWeight="Bold" Text="{Binding Name}" />
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
    </GroupStyle>
</ItemsControl.GroupStyle>
<ItemsControl.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <TextBlock DockPanel.Dock="Left" FontWeight="Bold" Text="{Binding Items[0].Group.GroupName}" />
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
    </GroupStyle>
</ItemsControl.GroupStyle>

我不明白的是为什么它会这样,PropertyGroupDescription不使用Equals和GetHashCode吗

显然不是。它使用反射可以按字符串指定的任何属性分组。

按组的GroupName属性分组:

并显示组的名称:

<ItemsControl.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <TextBlock DockPanel.Dock="Left" FontWeight="Bold" Text="{Binding Name}" />
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
    </GroupStyle>
</ItemsControl.GroupStyle>
<ItemsControl.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <TextBlock DockPanel.Dock="Left" FontWeight="Bold" Text="{Binding Items[0].Group.GroupName}" />
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
    </GroupStyle>
</ItemsControl.GroupStyle>
并将TextBlock绑定到组中第一个项的组的GroupName属性:

<ItemsControl.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <TextBlock DockPanel.Dock="Left" FontWeight="Bold" Text="{Binding Name}" />
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
    </GroupStyle>
</ItemsControl.GroupStyle>
<ItemsControl.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <TextBlock DockPanel.Dock="Left" FontWeight="Bold" Text="{Binding Items[0].Group.GroupName}" />
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
    </GroupStyle>
</ItemsControl.GroupStyle>

我不明白的是为什么它会这样,PropertyGroupDescription不使用Equals和GetHashCode吗


显然不是。它使用反射,可以根据字符串指定的任何属性进行分组。

此解决方案的问题是,多个组可以具有相同的名称。我更新了我的帖子以指定此名称,如果我这样做,它们将在视图中合并。组是通过它们的ID来区分的,我不能按ID排序,因为这样我会在视图中丢失组名。我想按组分组的另一个原因是,我有一些命令希望将组作为参数传递给。我不明白的是,为什么它会这样,PropertyGroupDescription不使用Equals和GetHashCode吗?如果是这样的话,应该和按ID分组一样好……我编辑了我的答案。你想考虑投票,因为它解决了你原来的问题。如果你有其他问题,你应该问一个新问题。啊,我不知道你可以使用项目绑定在一个groupstyle。我想我可以做到这一点,谢谢。这个解决方案的问题是,多个组可以有相同的名称。我更新了我的帖子以指定此名称,如果我这样做,它们将合并到视图中。组是通过它们的ID来区分的,我不能按ID排序,因为这样我会在视图中丢失组名。我想按组分组的另一个原因是,我有一些命令希望将组作为参数传递给。我不明白的是,为什么它会这样,PropertyGroupDescription不使用Equals和GetHashCode吗?如果是这样的话,应该和按ID分组一样好……我编辑了我的答案。你想考虑投票,因为它解决了你原来的问题。如果你有其他问题,你应该问一个新问题。啊,我不知道你可以使用项目绑定在一个groupstyle。我想我能做到,谢谢。
<ItemsControl.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <TextBlock DockPanel.Dock="Left" FontWeight="Bold" Text="{Binding Items[0].Group.GroupName}" />
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
    </GroupStyle>
</ItemsControl.GroupStyle>