我可以在不破坏和添加新项目的情况下更新ObservableCollection <t>中的值吗?</t>

时间:2010-11-23 22:19:28

标签: c# wpf

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

  • 取消选择的项目
  • 打开的上下文菜单变得无法绑定且无用
  • 可能会丢失所有丢失的项目实例中的错误

所以我问是否有任何方法可以更新与之前值不匹配的项目的值。我仍然需要它为UI友好的DataBinding(在PropertyChanged上自动更新)。

2 个答案:

答案 0 :(得分:3)

如果您可以在集合中找到玩家,则只需将更新的属性值映射到它们即可。如果玩家自己实现了INotifyPropertyChanged,那么它应该可以轻松完成。

答案 1 :(得分:1)

一种选择是将Player数据提取到自己的类中,并将数据封装在包装器中。例如:

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
    }
}

现在您可以替换播放器的数据,而无需使外部播放器实例无效。如果仔细观察,这实际上是底层Player模型的一种ViewModel。