ICollectionView。Source在尝试更新视图时返回null's过滤器。[英] ICollectionView.Source returns null when trying to update the View's Filter.

本文是小编为大家收集整理的关于ICollectionView。Source在尝试更新视图时返回null's过滤器。的处理方法,想解了ICollectionView。Source在尝试更新视图时返回null's过滤器。的问题怎么解决?ICollectionView。Source在尝试更新视图时返回null's过滤器。问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

你好,

我创建了一个 ICollectionView:

private ObervableCollection<Apples>MyCollection = new ObervableCollection();public ICollectionView 查看 {get;私有 设置;}private void Init(){CollectionViewSource Cvs = new CollectionViewSource();Cvs.Source = ObervableCollection;View.Source = Cvs.View;}private void UpdateFilter(string Color){使用 (View.DeferRefresh) //不需要{View.Filter = (o) = > {return ((Apple)(o)).Color= 颜色;}}}


这里可能存在代码编译错误,我在另一台电脑上..

问题是,当我单击 UI 中的复选框以基于字符串重新应用过滤器时,当代码到达"View.Filter = ....."时,它会引发空引用异常(没有更多信息,但如果你观察你可以看到View"SourceCollection"的属性是NULL).

执行的线程是主线程..
我也尝试使用调度程序中的 Invoke 或 BeginInvoke,但没有运气..

更多信息:
选中\取消选中 Ui 中的复选框会更新绑定的支持属性 ShowHide(Bool).
ShowHide 调用UpdateFilter(string X) 然后出现问题..

提前致谢

推荐答案

 public  ViewModel{ObservableCollection<客户>CustomerList = new ObservableCollection();public ICollectionView BlueCustomersView { get;私有 设置;}public ICollectionView BlackCustomersView { get;私有 设置;}public ICollectionView RedCustomersView { get;私有 设置;} //UnBoundpublic ICollectionView CyanCustomersView { get;私有 设置;} //UnBoundpublic ICollectionView PinkCustomersView { get;私有 设置;} //UnBoundpublic ICollectionView OrangeCustomersView { get;私有 设置;} //UnBoundpublic ViewModel(){for (int i = 0; i< 10000; i++){Customer Cust = new Customer();客户名称 = i;Cust.Color = (i % 2 == 0) ?刷子.AliceBlue:刷子.黑色;CustomerList.Add(Cust);}/********************************************************************************* 将 this 移到函数之外以使事情正常进行* *******************************************************************************/CollectionViewSource CvBlue = new CollectionViewSource();CollectionViewSource CvBlack = new CollectionViewSource();CollectionViewSource CvRed = new CollectionViewSource();//未绑定CollectionViewSource CvCyan = new CollectionViewSource();//未绑定CollectionViewSource CvPink = new CollectionViewSource();//未绑定CollectionViewSource CvOrange = new CollectionViewSource();//未绑定/*******************************************************************************//************* 绑定 **************/CvBlue.Source = 客户列表;BlueCustomersView = CvBlue.View;CvBlack.Source = 客户列表;BlackCustomersView = CvBlack.View;/************ **************//*********** 未绑定 **************/CvRed.Source = CustomerList;RedCustomersView = CvRed.View;CvCyan.Source = 客户列表;CyanCustomersView = CvCyan.View;CvPink.Source = 客户列表;PinkCustomersView = CvPink.View;CvOrange.Source = 客户列表;OrangeCustomersView = CvOrange.View;/************ **************/}public void ApplyFiltering(){//绑定CollectionViewsBlueCustomersView.Filter = (o) => { return ((Customer)o).Color ==刷子.AliceBlue;};BlackCustomersView.Filter = (o) => { return ((Customer)o).Color ==刷子.黑色;};//未绑定的 CollectionViewsRedCustomersView.Filter = (o) => { return ((Customer)o).Color ==刷子.红色;};CyanCustomersView.Filter = (o) => { return ((Customer)o).Color ==画笔.青色;};PinkCustomersView.Filter = (o) => { return ((Customer)o).Color ==刷子.粉红色;};OrangeCustomersView.Filter = (o) => { return ((Customer)o).Color ==画笔.橙色;};}}</客户></客户>


为了防止框架处理 CollectionViewSource,您应该将其设为全局类变量,而不是函数内部的变量.

如果 CollectionViewSource 的 Property View 被绑定到某个地方,或者简单地说它有一个引用,即使它不是全局的,它也能正常工作.

然而,一旦丢失,框架可能正在 GCing 和处理它.
我怀疑 CollectionView 的 Source 属性是 WeakReference
CollectionViewSource 的 View 属性.


TestProject 链接:https://docs.google.com/open?id=0B4xi5POVxsrxNDJnWnMxZ3p5VzA[^]

请看这里:
http://marlongrech.wordpress.com/2008/11/22/icollectionview-explained/[^]

我认为您的问题是您如何填充 ICollectionView,应该这样做:
ICollectionView view = CollectionViewSource.GetDefaultView(myData);

本文地址:https://www.itbaoku.cn/post/1355957.html