2014-05-06 38 views
0

我將DataGridItemsSource屬性綁定到ViewModel中的屬性。我然後創建一個ICollectionView和創建與DataGrid的項目源的默認視圖,像這樣:如何判斷ICollectionView目前是否可過濾?

_displayItemsView = CollectionViewSource.GetDefaultView(_displayItems);

其中_displayItemsList_displayItemsViewICollectionView

現在我遇到的問題是,我可以讓用戶進行過濾,像這樣的數據網格:

     _displayItemsView.Filter = delegate(object item) 
         { 
          DISPLAY_ITEM displayItem = (DISPLAY_ITEM)item; 
          if ((displayItem.RETAIL_ITEM_DPCI.ToString().ToUpper().Contains(value.ToUpper())) 
             . 
             . 
             . 

這個工作的時候好了大多數,但如果用戶當前正在編輯或添加在DataGrid中出現一個未處理的異常,由ICollectionView引發。我應該如何去檢測,如果任一:

  1. DataGrid目前正在修改或
  2. ICollectionView不在狀態,被過濾?

任何指導意見,我很樂意接受意見。謝謝!

+0

該異常會有一個消息屬性。信息內容是什麼? –

+0

@GarryVass在AddNew或EditItem事務期間不允許「Filter」消息。「 –

回答

2

對於您的問題編號1,WPF DataGrid具有可供您使用的事務語義。如果綁定集合中的對象實現IEditableObject,則代碼將獲得三個通知:開始編輯,結束編輯和取消編輯。您可以跟蹤這些通知並實施一些管家代碼來判斷DataGrid是否被修改。根據您的設計,您需要將DataGrid的SelectionUnit/SelectionMode屬性設置爲與您想要的通知一致。

對於您的問題2,當基礎集合繼承自IList(例如ObservableCollection)時,您可以通過鑄造CollectionViewSource.GetDefaultView獲得ListCollectionView

ListCollectionView上有幾個屬性,會給你你需要的信息...

  • CurrentEditItemCurrentAddItem當這些國家是主動將指向各自的 對象。

  • IsAddingNew會告訴你,如果添加事務正在進行

  • IsEditingItem會告訴你,如果一個編輯事務正在進行

  • IsInUse,如果有任何現有用戶會告訴

使用這些屬性和IEditableObject接口將爲您提供避免發生異常所需的所有信息婷。

+0

很好的答案,謝謝! –