65.9K
CodeProject 正在变化。 阅读更多。
Home

基于两个或多个属性的分组

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2011 年 12 月 30 日

CPOL
viewsIcon

15564

自定义 ICollectionView,以便在同一层级基于两个或多个属性对项目进行分组

原始博客文章可以在这里找到 这里[^] 默认情况下,CollectionViewSource 在指定两个或多个属性名称作为 GroupDescriptions 时会嵌套分组。 这是一种尝试基于两个或多个属性名称在同一层级对项目进行分组的方法。 简而言之,可以表示为:1. 实现 ICollectionView 2. 监听 GroupDescription 的变化,3. 当 GroupDescription 变化时,获取可能的唯一组名和关联的项目。 4. 从上述组合创建 CollectionViewGroup。 5. 将其绑定为数据源。
void OnGroupDescriptionsChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    groups.Clear();

    var propNames = GroupDescriptions
        .OfType<PropertyGroupDescription>()
        .Select(pDesc => pDesc.PropertyName);

    var groupNames = SourceCollection
        .OfType<object>()
        .Select(i => GetGroupName(i,propNames))
        .Distinct();

    var viewGroups = groupNames
        .Select(gName => new CollectionViewGroup(gName,
            SourceCollection
            .OfType<object>()
            .Where(i => GetGroupName(i, propNames).Equals(gName))));

    foreach (object group in viewGroups)
        groups.Add(group);
}

private string GetGroupName(object item, IEnumerable propNames)
{

        var groupName = string.Empty;

	foreach (string propertyName in propNames)
	{
		groupName += item.GetType()
		.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public)
			.GetValue(item, null)
			.ToString() + " ";
	}

        return groupName;
}

这里是 示例[^] 请查看并告诉我您的建议!!! 快乐编码!!! :)
© . All rights reserved.