我的WPF应用程序遇到了这个问题 - 我正在使用ObservableCollection<T>
将UI绑定到一组玩家。使用从游戏服务器流式传输的新数据,此列表每10秒更新一次。问题是,清除列表并重新添加所有内容会导致一些可怕的UI不一致:
所以我问是否有任何方法可以更新与之前值不匹配的项目的值。我仍然需要它为UI友好的DataBinding(在PropertyChanged上自动更新)。
答案 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。