Slo*_*ong 0 c# wpf datagrid filter icollectionview
我绑定ItemsSource的属性DataGrid在我的ViewModel的属性。然后我创建一个ICollectionView并使用DataGrid的项目源创建一个默认视图,如下所示:
_displayItemsView = CollectionViewSource.GetDefaultView(_displayItems);
其中_displayItems是 aList并且_displayItemsView是ICollectionView。
现在我遇到的问题是我允许用户像这样过滤数据网格:
_displayItemsView.Filter = delegate(object item)
{
DISPLAY_ITEM displayItem = (DISPLAY_ITEM)item;
if ((displayItem.RETAIL_ITEM_DPCI.ToString().ToUpper().Contains(value.ToUpper()))
.
.
.
Run Code Online (Sandbox Code Playgroud)
这在大多数情况下都很好用,但是如果用户当前正在编辑或DataGrid在ICollectionView. 我应该如何检测:
DataGrid目前正在修改或ICollectionView不在状态,被过滤?感谢任何指导,我对想法持开放态度。谢谢!
对于您的问题 1,WPF DataGrid 具有可用的事务语义。如果绑定集合中的对象实现IEditableObject,则您的代码将收到三个通知:开始编辑、结束编辑和取消编辑。您可以跟踪这些通知并实现一些内务处理代码来判断 DataGrid 是否正在被修改。根据您的设计,您需要将 DataGrid 的SelectionUnit/SelectionMode 属性设置为与您想要的通知一致。
对于您的问题 2,当基础集合继承自 IList(ObservableCollection例如)时,您可以ListCollectionView通过 cast获得 a CollectionViewSource.GetDefaultView。
它ListCollectionView有几个属性,可以为您提供所需的信息......
CurrentEditItem并且CurrentAddItem当这些状态处于活动状态时将指向它们各自的对象。
IsAddingNew 会告诉您是否正在进行添加交易
IsEditingItem 会告诉您是否正在进行编辑事务
IsInUse 会告诉是否有任何当前订阅者
使用这些属性和 IEditableObject 接口将为您提供避免出现异常所需的所有信息。