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