2010-11-23 34 views
0

我有我的WPF應用程序的這個問題 - 我使用ObservableCollection<T>綁定用戶界面到玩家集合。該列表每10秒更新一次,並從遊戲服務器傳輸新數據。問題是,吹走列表並重新添加一切將導致某些可怕的UI不一致:我可以在不破壞和添加新項目的情況下更新ObservableCollection <T>中的值嗎?

  • 所選項目成爲取消
  • 上下文菜單打開變成鬆散的和無用
  • 可能一些錯誤來自所有此起彼伏物品實例丟失

所以我問是否有任何方法可以更新與以前的值不匹配的項目的值。我仍然需要它爲UI的DataBinding友好(在PropertyChanged上自動更新)。

+0

據我所知,ObservableCollection 已經實現了INotifyChange接口,因此它們被刷新我認爲代碼示例在這裏會非常有幫助。 – 2010-11-23 22:26:49

+0

我認爲ObservableCollection將只會通知正在添加或刪除的項目 - 我不認爲更新集合中已有的實際項目將實現此目的。我認爲該項目本身必須實施INotifyPropertyChanged。 – 2010-11-23 22:34:19

回答

3

如果您可以在集合中找到玩家,您可以簡單地將更新後的屬性值映射到它們。如果玩家自己實現INotifyPropertyChanged,它應該只需很少的努力。

+0

謝謝菲爾。我最終做的是讓Player類實現INotifyPropertyChanged,並通過不替換它們來管理項目的更新,但檢查它們是否先存在,然後使用這一行代碼更新它們。 Player p = Team1List.Where(i => i.PlayerName == player.PlayerName).FirstOrDefault();然後將p設置爲更新後的播放器實例並相應更新。 – erodewald 2010-11-24 00:02:27

1

一種選擇是將播放器數據提取到其自己的類中並將數據封裝在包裝中。例如:

public sealed class PlayerData 
{ 
    //Data related to the Player (possibly immutable) 
} 

public sealed class Player : INotifyPropertyChanged 
{ 
    private PlayerData _data; 

    //Mirror properties for information in data 

    //Other functionality 

    public void ChangeData(PlayerData newData) 
    { 
     _data = newData; 
     //Trigger OnPropertyChanged(null) here to invalidate public state 
    } 
} 

現在,您可以替換播放器的數據,而不必使外部播放器實例無效。如果仔細觀察,這實際上是底層播放器模型的一種ViewModel。

相關問題