【问题标题】:Updating application data structures after deserializing XML file反序列化 XML 文件后更新应用程序数据结构
【发布时间】:2017-09-19 13:51:40
【问题描述】:

在反序列化 XML 文件后更新基于 ObservableCollection 的数据结构的最简单方法是什么?

  1. 清除当前数据结构并添加来自 XML 反序列化的元素,从而保留 DataContext 绑定。​​
  2. 创建一个新的数据结构,并将 DataContext 设置为新的结构。

将 Window DataContext 设置为 null 然后返回其 ViewModel 有效。但是随后必须在每个 Window 和 UserControl 上重置 DataContext,这似乎有点像一个肮脏的 hack。

编辑:

根据mm8 的回答,我发现了这个Enhanced ObservableCollection 实现:

https://www.codeproject.com/Articles/249311/Enhanced-ObservableCollection

由于我只需要一个可以抑制更改通知的 ObservableCollection 实现,我发现 ReactiveList 对我的需求来说开销太大。

【问题讨论】:

  • 清除并重新填充同一个 ObservableCollection 怎么样?
  • 这就是我对第一个选项的意思(请参阅改进的问题格式)。但是哪个更好呢?
  • 问题是数据结构在 View 之前被实例化,在某些情况下它绑定到某些 ObservableCollections 中的第一个元素。因此,在清除 ObservableCollection 时,我将创建一种情况,即在再次填充 ObservableCollection 之前,视图绑定到不存在的元素。

标签: c# xml wpf


【解决方案1】:

您可以清除并重新填充相同的ObservableCollection<T>。但是你可能希望使用支持抑制更改通知的INotifyCollectionChanged 接口的实现,例如ReactiveUI 的ReactiveList<T>:https://github.com/reactiveui/ReactiveUI/blob/b551dfe13c21090b7529bd69539433bbe91b63fb/src/ReactiveUI/ReactiveList.cs

然后您可以像这样更新数据绑定集合:

ReactiveList<object> sourceCollection = new ReactiveList<object>();
...
using (sourceCollection.SuppressChangeNotifications())
{
    sourceCollection.Clear();
    foreach(var item in ...)
        sourceCollection.Add(item);
}

...这只会引发一个 CollectionChanged 事件。

【讨论】:

  • 啊,很好的答案!它还回答了我的另一个问题,关于在重新填充现有数据结构时左右触发通知。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多