2011-10-24 30 views
1

我正在開發使用MVVM建築師WPF應用程序,並作爲一個常見的場景使用性質在更改通知像通知屬性更改事件沒有二傳手

public List<EmployeeInfo> Employees 
    { 
      get 
      { 
       return _employees; 
      } 
      set 
      { 
       _employees = value; 
       NotifyPropertyChanged(() => Employees); 
      } 
     } 

我唯一的問題是,我使用的屬性設置來通知應用程序關於一些價值的變化,並根據FxCop這是一個不好的做法和'CollectionPropertiesShouldBeReadOnly'。所以我想改進一點,所以告訴我一些機制,我可以使用通知屬性更改而不使用setter。

+0

ObservableCollection本身支持通知更改爲什麼你需要在這裏添加自己的? – NoviceProgrammer

回答

3

如果您的集合屬性是隻讀的,則不需要通知任何整個集合已更改爲不同的集合屬性 - 相反,集合上的事件處理程序將收到集合中的更改通知(添加項目等)。

如果您需要能夠更改視圖模型中屬性引用的集合,則始終可以使引用設置器私有並保留現有的通知機制。

+0

我的集合屬性不是隻讀的,但我不想爲它編寫setter,用戶可以直接添加或刪除任何東西,我只是希望它會通知我,只要它發生,請不要期望它是Observable集合總是,它可以是任何列表,IEnumerable,字典等。謝謝 –

+0

@MSingh:這是一個巨大的差異 - 如果它是一個列表那麼*就沒有通知機制。這是'ObservableCollection '的整個*點*。聽起來你不清楚只讀*屬性*(一個沒有setter的)和一個不可變的* collection *(其內容不能被改變的)之間的區別。這聽起來像你只需要一個只讀屬性,但返回一個可變(可變長)的集合。如果你想讓這個集合通知監聽器,你必須使用'ObservableCollection '或者類似的東西。 –

+0

是的,我對這些場景感到困惑,但感謝您的幫助。非常感謝 –

0

ObservableCollection本身通知發生的變化。所以你不需要引發PropertyChanged事件。如果您認爲有必要更改集合,那麼您可以刪除和添加項目。由於可觀察的模式,這些變化將被宣佈。

0

您使用setter的這一事實意味着您試圖用新的對象實例替換集合的實例。如果您只是擔心集合中的項目發生更改,這已經集成到observablecollection中。 FxCop會抱怨setter是否有notifypropertychanges調用或不。