4

我有一个collectionviewsource

<CollectionViewSource x:Name="groupedItemsViewSource" 
                          ItemsPath="Items" />

并将其作为 itemssource 提供给 gridview

ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"   

源代码在文件后面的代码中设置:

groupedItemsViewSource.Source = AllGroups;

和 AllGroups 是

public ObservableCollection<DataGroup> AllGroups

其中 DataGroup 包含一个 Observable 项目集合

 public ObservableCollection<DataItem> Items

问题是它不显示带有项目的组,而是我只得到 3 个 gridviewitems,它们对应于 AllGroups 中的 3 个数据组

我尝试添加 IsSourceGroupped = "true",但是当我这样做时,应用程序崩溃,出现一个窗口,显示“myapp.exe [3192] 中发生未处理的 win32 异常”

4

2 回答 2

0

看起来您所缺少的只是 CollectionViewSource 上的 IsSourceGrouped="true" 属性。

于 2012-09-25T09:20:28.037 回答
0

CollectionViewSource 中的 Source 属性应该实现 IGrouping 接口,否则这些组将无法在 GridView 或 ListView 中工作。
使用 Linq 表达式 GroupBy 将您的结果分组到具有指定键的组中,或者您可以像这样扩展 ObservableCollection 类:

public class GroupedObservableCollection<T> : ObservableCollection<T>, IGrouping<string, T>
{
    /// <summary>
    /// Key as the Group identificator.
    /// </summary>
    public string Key { get; set; }
}

并在您的课程中使用它(我在 ViewModel 中有 CollectionViewSource,而不是在 XAML 中):

public GroupedObservableCollection<DataItem> Items

groupedItemsViewSource = new CollectionViewSource { Source = AllGroups, ItemsPath = new PropertyPath("Items"), IsSourceGrouped = true };

这样绑定就可以工作了。还要确保在 ListView 和 GridView 中使用正确的绑定:

<!-- zoomed in view -->
<GridView ItemsSource="{Binding groupedItemsViewSource.View}" ... />

<!-- zoomed out view -->
<GridView ItemsSource="{Binding groupedItemsViewSource.View.CollectionGroups}" ... />
于 2012-09-25T08:20:01.600 回答