c# - WPF 中的 BindingOperations.EnableCollectionSynchronization 之谜

标签 c# .net wpf

我一直在努力理解这个概念,即使经过多次实验,我仍然无法弄清楚 WPF 中的 ObservableCollections 和使用 BindingOperations.EnableCollectionSynchronization 的最佳实践是什么。

如果我有一个带有可观察集合的 View 模型,并且我使用锁在其上启用了集契约(Contract)步,如下所示:

m_obsverableCollection = new ObservableCollection<..>;
BindingOperations.EnableCollectionSynchronization(m_obsverableCollection,
                                                   m_obsverableCollectionLock);

这是否意味着对该可观察集合的每次修改和枚举都将:

  1. 使用 m_obsverableCollectionLock 自动锁定集合?
  2. 在创建集合的线程上整理所有修改?
  3. 在调用绑定(bind)操作的线程上整理所有修改?

使用 BindingOperations.EnableCollectionSynchronization 时,我是否需要显式进行任何类型的锁定?

产生这一切的问题是,即使在使用 BindingOperations.EnableCollectionSynchronization 并使用我传递给该方法的相同锁锁定项目之后,我偶尔也会收到 “这种类型的 CollectionView 不支持更改其 SourceCollection来自与 Dispatcher 线程不同的线程。” 异常

最佳答案

我们终于追根究底了:

我们必须在调度程序上启用 CollectionSynchronization:

Application.Current.Dispatcher.BeginInvoke(new Action(()=>
{
    BindingOperations.EnableCollectionSynchronization(m_obsverableCollection, m_observableCollectionLock);
}));

然后每当任何其他线程想要访问可观察对象时,您可以简单地:

lock (m_observableCollectionLock)
    m_observableCollection.Add(...)

关于c# - WPF 中的 BindingOperations.EnableCollectionSynchronization 之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19734782/

相关文章:

c# - 导入相对于解决方案文件夹的 P12/PFX 关键位置

c# - "smooth"随机数的算法

c# - 当你的实现是一个空方法时,你如何 "properly"实现 Dispose() (根据 FxCop)? (CA1063)

c# - 将文本文件(由桌面客户端读取)中的数据发布到基于 ASP .NET 的服务器

c# - Oracle.DataAccess.Client.OracleException ORA-03135 : connection lost contact 错误

wpf - StockTrader RI > Controller 、演示者、WTF?

.net 4.5 中可绑定(bind)的 WPF Richtextbox

c# - 使用 CMS 进行 ASP.NET MVC 项目的最佳方法是什么

c# - 如何不允许 WPF Combobox 为空

c# - 如何跨 Visual Studio 项目初始化自动映射器