1

我有一個帶有數據網格和按鈕的簡單窗體。數據網格中的項目綁定到的ObservableCollectioncustomer實現了INotifyPropertyChanged接口。每個客戶都有一個deleted屬性(類型bool)。我爲客戶默認視圖設置了一個過濾器,以根據deleted屬性過濾掉已刪除的客戶。到目前爲止它的工作。當過濾器更改的項目屬性時,Datagrid未更新

然後我添加一個標記選定的客戶按鈕被刪除的事件。問題是在設置selected_customer.deleted = true後網格未更新。被刪除的客戶仍然可見。綁定到deleted屬性的列正確更新。要從網格中刪除客戶,我必須手動調用客戶默認視圖的Refresh()方法。

爲什麼當我使用ObservableCollection和客戶實現INotifyPropertyChanged接口時,datagrid不會自動更新?如何自動更新?

回答

0

我假設你使用CollectionViewSource進行過濾。 下面的代碼將訂閱對客戶的已刪除屬性的更改,並在刪除更改時刷新集合視圖源。客戶是Customer類的ObservableCollection。客戶有一個名爲Deleted的bool屬性,並實現INotifyPropertyChanged。在填充Customers之前應調用InitAutoRefresh()。

private void InitAutoRefresh(ObservableCollection<Customer> observableCollection, CollectionViewSource collectionViewSource) 
{ 
    observableCollection.CollectionChanged += 
     (sender, e) => 
     { 
      foreach(Customer newItem in e.NewItems) 
      { 
       newItem.PropertyChanged += 
        (sender2, e2) => 
        { 
         if (e2.PropertyName == "Deleted") 
         { 
          collectionViewSource.View.Refresh(); 
         } 
        }; 
      } 
     }; 
} 

在填充可觀察集合之前調用它。如果您在XAML中聲明瞭collectionViewSource,則可以使用FindResource來獲取實例。

InitAutoRefresh(Customers, FindResource("cvsCustomers") as CollectionViewSource); 
+0

這看起來像個好主意。謝謝。 – 2010-06-23 08:09:44

相關問題