gpt4 book ai didi

WPF:尽管使用了 Dispatcher.BeginInvoke,但访问绑定(bind)的 ObservableCollection 仍失败

转载 作者:行者123 更新时间:2023-12-04 08:26:07 24 4
gpt4 key购买 nike

我有以下内容:

public ICollectionView Children
{
get
{
// Determining if the object has children may be time-consuming because of network timeouts.
// Put that in a separate thread and only show the expander (+ sign) if and when children were found
ThreadPool.QueueUserWorkItem(delegate
{
if (_objectBase.HasChildren)
{
// We cannot add to a bound variable in a non-UI thread. Queue the add operation up in the UI dispatcher.
// Only add if count is (still!) zero.
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
if (_children.Count == 0)
{
_children.Add(DummyChild);
HasDummyChild = true;
}
}),
System.Windows.Threading.DispatcherPriority.DataBind);
}
});

return _childrenView;
}
}

效果很好:HasChildren 在后台线程中运行,该线程使用调度程序将其结果插入到用于绑定(bind)到 UI 的变量中。

注意:_childrenView 设置为:

_childrenView = (ListCollectionView) CollectionViewSource.GetDefaultView(_children);

问题:

如果我从另一个 ThreadPool 线程调用 Children 属性,我会在该行中收到 NotSupportedException

_children.Add(DummyChild);

异常文本:“这种类型的 CollectionView 不支持从与 Dispatcher 线程不同的线程更改其 SourceCollection。”

为什么?我已验证该代码是从 Dispatcher 线程执行的。

最佳答案

我们之前就遇到过这个问题。问题有两个:

1- 确保对 SourceCollection 的任何更改都在主线程上(您已经完成了)。

2- 确保 CollectionView 的创建也在主线程上(如果它是在不同的线程上创建的,例如响应事件处理程序,则通常不会出现这种情况)。 CollectionView 期望修改发生在“它的”线程上,并且“它的”线程是“UI”线程。

关于WPF:尽管使用了 Dispatcher.BeginInvoke,但访问绑定(bind)的 ObservableCollection 仍失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4527152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com