2012-09-26 31 views
0

我與的ObservableCollection的2個屬性的類:通知不工作了的ObservableCollection

Public ObservableCollection<User> Users 
    { get {return this._users;}} 

Public ObservableCollection<User> Admins 
    { get {return new ObservableCollection<User>(Users.Where(u => u.type == 1));}} 

的問題是,當我更改用戶,物業用戶被通知,而不是管理員。 有什麼建議嗎?

回答

1

如果您綁定到視圖中的管理員,它將獲得一個新的ObservableCollection用戶的副本。

如果您在視圖模型中編碼Admins.Add(new User()),它將在與綁定的實例不同的實例上運行。

您應該更改您的代碼,以便它使用單個實例(而不是每次都重新創建它)。

編輯(追加例題):

private ObservableCollection<User> _admins = new ObservableCollection<User>(); 
    public ObservableCollection<User> Admins 
    { 
     get 
     { 
      _admins.Clear(); 
      Users.ForEach(p => { if (p.type == 1) { _admins.Add(p); } }); 
      return _admins; 
     } 
    } 

。注意的ObservableCollection的實例沒有變化(這是關鍵的解決方案)。我只需清除它並將用戶重新加載到集合中即可。

+0

感謝您的評論,我將Admins屬性綁定到DataGridColumn,您有任何建議更改代碼嗎? –

+1

@DotNeter修復它的最簡單方法是向用戶添加一個'CollectionChanged'事件,該事件引發''Admins''的'PropertyChanged'事件,以便在用戶集合發生變化時重新評估它。例如,'Users.CollectionChanged + = Users_CollectionChanged',其中'Users_CollectionChanged'調用'RaisePropertyChanged(「Admins」);' – Rachel

+1

@DotNeter更新了我的答案以包含解決方案。 Rachel的解決方案也可以工作,但需要連接一個事件處理程序。我會留給你決定你更喜歡哪種方式。我更喜歡每次調用getter時都不要創建一個集合的新實例,因爲您將有額外的垃圾收集和引用浮動。 –