我正在尝试在我的 WPF 应用程序中绑定一些控件BindingList
。ComboBox
但是,MyBindingList
是从 UI 线程以外的其他线程更新的。
我做了一个模型。您所需要的只是新的空项目,其中包含对 WindowsBase、PresentationCore、PresentationFramework、System.Xaml 的引用(或者只是将其放入预定义的 WPF 窗口中)。
using System;
using System.ComponentModel;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
public class MainWindow : Window
{
[STAThread]
public static void Main()
{
new MainWindow().ShowDialog();
}
public MainWindow()
{
BindingList<string> list = new BindingList<string>();
ComboBox cb = new ComboBox();
cb.SetBinding(ComboBox.ItemsSourceProperty, new Binding() { Source = list });
this.Content = cb;
list.Add("Goop");
new Thread(() =>
{
list.Add("Zoop");
}).Start();
}
}
在行中Goop
,一切正常。但是,当它到达这Zoop
条线时,它会抛出一个异常:
这种类型的 CollectionView 不支持从不同于 Dispatcher 线程的线程更改其 SourceCollection。
在实际项目中,我无法将其list.Add
移至 UI 线程,并且我想保留 Binding 问题。如何解决?我可以转移到其他“列表”而不是BindingList
. 我尝试过简单List<string>
但更糟糕的是:当我添加新项目时它根本不会更新。
编辑
实际上,添加线程知道列表,但不知道 WPF 窗口。该列表在具有内部工作的类中,GUI 检查并查看该类。所以,不Add
应该知道GUI。