我有一个用于同步的后端字典(即同时用于文件存储和Web服务)。
除此之外,我需要生成要使用的WPF前端的列表/枚举。将可枚举字符串连接到字典,并在更新为使用ObservableCollection并使其自动调用PropertyChanged
时调用CollectionChanged
之间有什么区别。
同步在后台自动发生,某些元素可能会被删除,其他元素可能会被更新。我想将这些信息传播到WPF前端和用户。 (即,如果删除了一个项目,则不必重新初始化整个显示)。我还想在添加和删除项目时添加动画(即淡入和淡出) - 如果我替换整个列表还是会导致每个项目再次淡入,这是否可行?
我应该这样:
1)使用可观察的集合并在字典和集合之间编写一些奇特的同步逻辑吗?
2)使用linq扩展方法将字典转换为可枚举的,并且只要它发生变化,就可以简单地在枚举上调用propertychanged吗?
3)在字典和列表之间进行同步,只要更新列表就替换它?
此外,如何使用仅针对UI执行的排序和过滤操作? (即如果我需要根据用户选择从字典中过滤掉一些元素,我应该使用与你推荐的方法类似的方法吗?)
答案 0 :(得分:3)
如果您在获得更改时“替换”任何IEnumerable<T>
,则会在UI中刷新整个列表。
为了避免这种情况,您需要实现INotifyCollectionChanged
,并提供实现此功能的集合。您可以处理元素,而不是替换集合,而元素又会触发相应的事件。
ObservableCollection<T>
为您处理此问题。就个人而言,如果您需要将其保留在字典中,但希望将其与列表同步,则可能需要考虑制作自定义集合,可能基于SortedDictionary
。标准词典没有排序感,这意味着没有办法适当地实现INotifyCollectionChanged
。