本文记录一个 WPF 的已知问题,在通过 CollectionViewSource 获取到 CollectionView 之后,如果 CollectionViewSource 对象已被 GC 回收,将可能在调用 此问题已修复,请看 https://github.com/dotnet/wpf/pull/7390 此问题的复现步骤如下 在一个 WPF 项目里面,构建出一个 CollectionViewSource 代码如下 public MainWindow() { InitializeComponent(); var collectionViewSource = = true, }; var collectionView = collectionViewSource.View; _collectionView MyClass.Foo(); 阅读 WPF 框架的源代码,可以了解到原因就是因为 CollectionViewSource 对象没有被引用,从而被 GC 回收。
Changes 对于在GataGrid中做分组管理,现在的CollectionViewSource支持数据到GroupDescriptions的绑定,这样可以更加轻松的在XAML做分组。 ================================= <UserControl.Resources> <CollectionViewSource x:Name="dataSource > <CollectionViewSource.SortDescriptions> <compMod:SortDescription PropertyName ="AgeGroup" Direction="Ascending"/> </CollectionViewSource.SortDescriptions > </CollectionViewSource> </UserControl.Resources> <Grid x:Name="LayoutRoot" Background
排序 在WPF中要实现数据排序的功能有很多种,例如用Linq,但这种场景的标准做法是使用CollectionViewSource。 CollectionViewSource是一种数据集合的代理类。 在这个例子里使用CollectionViewSource排序的代码如下: private readonly CollectionViewSource _viewSource; public HighlightSample 的Source赋值后,把CollectionViewSource的View作为ListBox的数据源。 筛选 CollectionViewSource的View属性类型为ICollectionView接口,它提供了Filter属性用于实现数据的过滤。 结语 这篇文章介绍了使用CollectionViewSource实现的排序、筛选功能,以及使用附加属性和Inlines实现高亮功能。
CollectionViewSource是专为数据绑定有UI视图互动而设的,尤其是对于要实现分组的情况下,更需要它。 CollectionViewSource的几个重要的属性: Source是设置分组后的数据源,数据源就是通过上面的Linq进行转换处理。 View属性就是获取其视图数据. // 实例化CollectionViewSource对象 CollectionViewSource cvs = new CollectionViewSource(); cvs.IsSourceGrouped = true; //支持分组 // 分组后集合项的路径,本例中为 当然如果对CollectionViewSource还是不太熟悉,那就多调试几次。
下面我们看看数据的绑定过程: protected override void OnNavigatedTo(NavigationEventArgs e) { CollectionViewSource listViewSource = new CollectionViewSource(); listViewSource.IsSourceGrouped = true; listViewSource.Source 我们定义了一个 CollectionViewSource 类型的实例,它可以向集合类添加分组支持的数据源。把它的Source设置为我们定义的数据分组集合。 然后把listViewDetail 和 listViewSummary 的数据源分别设置为 CollectionViewSource 的视图对象和视图的集合组。
放在相同的一个 ListBox 里面 下面是多个不同的实现方式,解决如何在 WPF 中在 ListBox 或 ListView 绑定多个数据集合 ObservableCollection 对象 通过 CollectionViewSource 方式 在 ListView 或 ListBox 资源里面,添加 CollectionViewSource 绑定到集合里面,然后在 ItemsSource 使用 CompositeCollection 进行绑定,代码如下 <ListBox> <ListBox.Resources> <CollectionViewSource x:Key="DogCollection" Source="{Binding Dogs}"/> <CollectionViewSource x:Key="CatCollection" Source="{Binding Cats} </ListBox> 这个方法的优势在于可以完全使用 XAML 编写内容,但是缺点在于有重复的代码,如有多个绑定的集合对象,就需要在资源和 CompositeCollection 里面定义多个 CollectionViewSource
来自:BindingListCollectionView 类) CollectionView 的创建一般使用 CollectionViewSource.GetDefaultView 方法,这一点是 当在 XAML 中进行类似的特殊构造时,我们则可以使用 CollectionViewSource 标签,并设置它的 CollectionViewType 属性。 当 ItemsSource 存在时,_collectionView 字段是 CollectionViewSource.GetDefaultView 来为 ItemsSource 找到它所对应的 CollectionView
binding DataGridComboBoxColumn.ItemsSource – Stack Overflow 第三种方式采用静态资源进行绑定,参考代码: <Window.Resources> <CollectionViewSource x:Key="TestKey" Source="{Binding TestList}"> </CollectionViewSource> </Window.Resources> <DataGridComboBoxColumn
3 4 5 6 7 8 9 10 11 12 13 14 <ListBox Name="WalterlvDemoListBox"> <ListBox.Resources> <CollectionViewSource x:Key="Items1Source" Source="{Binding Items1}"/> <CollectionViewSource x:Key="Items2Source"
classes WinRT app guide: Step 6: Adding a DataTemplate to the ListView WinRT app guide: Step 7: Using CollectionViewSource
添加新分组
如果GrideView通过将IsSourceGrouped值为True来绑定CollectionViewSource情况下,GridView提供分组功能,这就意味着分组必须对数据源进行分组, 分组
使用GridViewEx控件,能够实现添加新分组和拖拽等功能,也是在App中最为常见的功能,实现分组必须完成以下设置:
为GridView绑定CollectionViewSource,必须使用支持分组的数据源 CollectionViewSource可视为代理服务器。 1: ///
ICollectionView ItemsSourceView { get { _ItemsSourceView = CollectionViewSource.GetDefaultView try { DataFilter = dataFilter; _ItemsSourceView = CollectionViewSource.GetDefaultView { if (_ItemsSourceView == null) { _ItemsSourceView = CollectionViewSource.GetDefaultView
12" }); 25 26 lbMain.ItemsSource = CollectionModelFile; 27 28 ICollectionView cv = CollectionViewSource.GetDefaultView
GroupStyle.HeaderTemplate> </GroupStyle> </ListView.GroupStyle> CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView
public ICollectionView ItemsSourceView { get { _ItemsSourceView = CollectionViewSource.GetDefaultView
但是,Freezable, InputBinding, Visual3D, GridViewColumn, ViewBase, CollectionViewSource, ResourceDictionary
相信很多开发者在用DataGrid时多多少少有用过(主要是通过CollectionView或CollectionViewSource)。典型的实现方式可以参考DataSourceProvider。
首先,ICollectionView利用CollectionViewSource和PropertyGroupDescription类实现数据分组,并通过绑定在XAML中展示。