我有一个ObservableCollection
在类级别声明。这是一组自定义控件。
private ObservableCollection<AssetCriticalDimensionItemDetail> _details;
private Dispatcher UIDispatcher;
调用一个在UI线程上实例化新ObservableCollection
的方法。我此时也在设置UI调度程序。
在代码的这一点上,一切都是同步完成的。我捕获了线程ID,因此我可以在修改集合时进行比较。
完成此操作后,会将一些控件添加到其他集合中,然后运行后台线程。完成后台线程后,用户可以在子控件中输入一些选项,然后单击“添加”。添加会触发一个事件,该事件会回调父控件并修改集合。
您可以从该图像中看到线程ID与UI线程相同,但即使它是在UI线程上创建的,它也不允许我修改集合。所以我尝试调用UIDspatcher.Invoke,但它仍然给我同样的错误。
此类型的CollectionView不支持从与Dispatcher线程不同的线程更改其SourceCollection。
答案 0 :(得分:-1)
听起来你可能正在后台线程上创建控件,然后在主UI线程上显示它们。或者,在UI线程上创建的控件可能与Dispatcher
- 在后台线程上创建的仿射对象进行交互。在任何一种情况下,这都是您的问题:从DispatcherObject
继承的任何对象都不可撤销地绑定到创建它的线程。
@MikeStrobel甚至可能吗?如果在UI线程上创建它们,AFAIK会在创建期间控制检查
是的,就框架而言,没有“UI线程”这样的东西。理论上,您的应用程序可以有多个运行WPF调度程序的线程。 DispatcherObject
的构造函数将其Dispatcher
属性初始化为Dispatcher.CurrentDispatcher
,如果当前线程尚不存在,则会为当前线程创建Dispatcher
(尽管新创建的Dispatcher
如果已创建,则实际上不会运行。)