我有一个类成分,其属性Items
属于List<Ingredient>
在我的一个页面中,我使用GridView显示所有成分,按第一个字母分组:
<Page.Resources>
<CollectionViewSource x:Name="IngredientsViewSource" IsSourceGrouped="True" ItemsPath="Items"/>
</Page.Resources>
加载页面时,CollectionViewSource的Source属性设置如下:
this.IngredientsViewSource.Source = CurrentData.Ingredients.GroupedItems;
GroupedItems
是Ingredients类的属性,它接受属性Items
并对所有内容进行排序和分组以便随时可用:
public object GroupedItems
{
get
{
if (this.Items != null)
{
return from IngredientIteration in this.Items
//orderby IngredientIteration.Name ascending
group IngredientIteration
by IngredientIteration.FirstLetter
into IngredientGroup
//orderby IngredientGroup.Key ascending
select new {
FirstLetter = IngredientGroup.Key,
Items = IngredientGroup
};
}
else
{
return null;
}
}
private set { }
}
这很有效。现在我想对结果进行排序,因为现在第一个字母的顺序都搞砸了。但是,当我删除两个orderby
子句前面的注释标记时,它会变得非常奇怪。保留类似它的orderby子句现在会产生正确排序的组,但只显示每组的第一个项目
但是,当我将升序改为降序时,一切都按预期工作:组按降序排序,所有项目都显示,并且项目按每组内降序排序。
这对我来说没有意义,为什么下降工作但不提升?我在这里错过了什么吗?
答案 0 :(得分:0)
虽然正如你所描述的那样(降序起作用但提升不起作用),但它太奇怪了。您的查询没有任何复杂的内容,我会使用method syntax
,它应该按预期工作:
public object GroupedItems {
get {
if (this.Items != null)
{
return Items.OrderBy(item=>item.Name)
.GroupBy(item=>item.FirstLetter)
.OrderBy(g=>g.Key)
.Select(g=> new {
FirstLetter = g.Key,
Items = g.ToList()
}).ToList();
}
else {
return null;
}
}
private set { }
}