在 C# 中创建集合视图
要创建集合视图,您必须生成一个实现ICollectionView并链接到基础集合的对象。您不需要直接创建对象。相反,您可以使用CollectionViewSource类中的静态方法。该方法名为“GetDefaultView”。
每当您使用 WPF 绑定到一个集合时,实际上是绑定到它的默认集合视图。此视图由 WPF 静默获取,通常不包括排序、分组或筛选。GetDefaultView 返回对默认视图的引用,然后您可以对其进行操作以添加这些功能。
让我们在 ProductData 类中创建两个属性来保存我们的视图。这些属性可以是我们绑定的目标。
public ICollectionView ProductsView { get; private set; }
public ICollectionView ProductOptionsView { get; private set; }
我们可以修改 ProductData 类的构造函数并添加一些私有方法来设置这两个视图。首先,我们不会更改可见数据。我们将简单地设置新属性来保存这两个集合的默认视图。
public ProductData(IList<Product> products, IList<ProductOption> options)
{
Products = new ObservableCollection<Product>(products);
ProductOptions = new ObservableCollection<ProductOption>(options);
InitialiseViews();
}
private void InitialiseViews()
{
InitialiseProductsView();
InitialiseProductOptionsView();
}
private void InitialiseProductsView()
{
ProductsView = CollectionViewSource.GetDefaultView(Products);
}
private void InitialiseProductOptionsView()
{
ProductOptionsView = CollectionViewSource.GetDefaultView(ProductOptions);
}
让我们修改两个ListBox的绑定以指向集合视图:
<TextBlock FontWeight="Bold" Foreground="White" FontSize="20">Products</TextBlock>
<ListBox Grid.Row="1" ItemsSource="{Binding ProductsView}" DisplayMemberPath="Name"/>
<TextBlock Grid.Column="1" FontWeight="Bold" Foreground="White"
FontSize="20">Options</TextBlock>
<ListBox Grid.Column="1" Grid.Row="1" ItemsSource="{Binding ProductOptionsView}"
DisplayMemberPath="Option"/>
运行程序以查看结果。您会发现显示的列表没有变化。
添加排序和分组
当我们在 XAML 中添加排序和分组时,我们创建了一个 CollectionViewSource 代理并设置了SortDescriptions和GroupDescriptions属性。使用 C# 执行相同的功能时,您可以将SortDescription对象添加到集合视图的SortDescriptions属性,或将PropertyGroupDescription对象添加到GroupDescriptions集合。对于这两种类型,您都可以通过将包含其名称的字符串传递给构造函数来设置控制属性。
修改两个初始化方法,如下所示,增加分组和排序。产品列表按其Group属性分组。然后每个组按名称排序。产品选项列表按Option属性排序。
private void InitialiseProductsView()
{
ProductsView = CollectionViewSource.GetDefaultView(Products);
ProductsView.GroupDescriptions.Add(new PropertyGroupDescription("Group"));
ProductsView.SortDescriptions.Add(
new SortDescription("Name", ListSortDirection.Ascending));
}
private void InitialiseProductOptionsView()
{
ProductOptionsView = CollectionViewSource.GetDefaultView(ProductOptions);
ProductOptionsView.SortDescriptions.Add(
new SortDescription("Option", ListSortDirection.Ascending));
}
要显示组详细信息,请修改 ListBox 以将数据模板添加到组样式:
<ListBox Grid.Row="1" ItemsSource="{Binding Products}"
DisplayMemberPath="Name">
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock Foreground="DarkGreen" Text="{Binding Name}"
FontStyle="Italic"/>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListBox.GroupStyle>
</ListBox>
结果窗口如下所示: