代码之家  ›  专栏  ›  技术社区  ›  erodewald

我可以在不破坏和添加新项的情况下更新可观察集合<T>中的值吗?

  •  0
  • erodewald  · 技术社区  · 14 年前

    我的WPF应用程序有这个问题——我正在使用 ObservableCollection<T> 将用户界面绑定到玩家集合。此列表每10秒更新一次,并使用从游戏服务器流式传输的新数据。问题是,取消列表并重新添加所有内容会导致一些可怕的UI不一致:

    • 选定的项目将被取消选择
    • 打开的上下文菜单变得不受约束且无用
    • 可能是所有项目实例丢失时出现的错误

    所以我想问是否有任何方法可以更新与前一个值不匹配的项的值。我仍然需要它对UI的数据绑定友好(PropertyChanged上的自动更新)。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Phil Sandler    14 年前

    如果可以在集合中找到播放器,则只需将更新的属性值映射到它们。如果播放器本身实现了INotifyPropertyChanged,那么它应该只需很少的努力就可以工作。

        2
  •  1
  •   Dan Bryant    14 年前

    一种方法是将播放器数据提取到自己的类中,并将数据封装在包装器中。例如:

    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。