是否可以修改用于<IGrouping<字符串、ItemsCollection>>的分组键,以便附加用于绑定的组计数信息?



以下查询返回类型<IGrouping<string, ItemsCollection>>,该类型可以绑定到GridView。与CollectionViewSource一起使用时,Key(作为组名)用于显示组标题/标题,例如通过绑定到GridView的GroupStyle.HeaderTemplate中的TextBlock。

var query = from ItemObj in ItemsObjCollection
orderby ItemObj.ItemName
group ItemObj by ItemObj.GroupName into groups
orderby groups.Key
select groups;

一切都如预期的那样顺利,到目前为止没有问题。

我的下一个尝试(在我发现困难的地方)是Key,它输出一个组名称来提供组项目计数,这样它就会被修改为"组名称[count]",在这里计数可以很容易地作为组获得。查询中的Count()。假设ItemsObjCollection表示Fruits,则标头输出需要像Apples[10]、Bananas[7]、Oranges[12]等

为了输出显示(通过绑定),是否可以修改分组密钥,使其附加所述的组计数信息?基本上,我想要Key = $"{groups.Key} [{groups.Count()}]",但不知道如何在查询中使用。沿着以下路线尝试:

select new { Key = $"{groups.Key} [{groups.Count()}]", Items = groups };

但我修改后的密钥没有出现在绑定中,所以没有走多远。我还发现,创建IGrouping的实例(因为它是一个接口)并希望在上面的查询语句中有一种聪明的方法可以做到这一点,而且肯定有人已经做到了。

我解决了它,但可能不太整洁。基本上,我基于上面的查询结果创建了一个等价的新查询,但根据需要修改了分组键。为此,我需要一个新的类来创建新的分组。

public class NewGrouping<TKey, TElement> : List<TElement>, IGrouping<TKey, TElement>
{
public TKey Key { get; set; }
}

接下来,通过迭代旧的分组来形成新的分组——在这个过程中,用附加信息修改密钥为Key = $"{grp.Key} [{grp.Count()}]"

List<IGrouping<string, ItemsObjCollection>> newQuery = new List<IGrouping<string, ItemsObjCollection>>();
foreach (var grp in query)
{
NewGrouping<string, ItemsObjCollection> newGroup = new NewGrouping<string, ItemsObjCollection>() { Key = $"{grp.Key} [{grp.Count()}]" };
newGroup.AddRange(grp.ToList());
newQuery.Add(newGroup);
}

使用newQuery而不是query绑定到GridView,瞧!工作符合预期。

附言:我想知道为什么有人认为我的问题没有那么有用/研究。这不是一个微不足道的问题,也许那个人不理解这个问题。

它已经存在group.Count了。

最新更新