这可能是一个简单/愚蠢的问题,但我不能简单地让标题中的三件事情起作用。我遵循以下SO答案的建议: WPF listbox dynamically populated - how to get it to refresh?
创建一个ObservableCollection并将ListBox.ItemsSource设置为该集合。由于集合是可观察的,因此ListBox将随着其内容的更改而更新。
但是,如果您的实际操作阻止了UI线程,则可能会这样做 在操作完成之前阻止WPF更新UI (因为WPF数据绑定基础结构没有机会 跑)。因此,您可能需要在后台运行冗长的操作 线。在这种情况下,您将无法更新 由WPF引起的后台线程的ObservableCollection 跨线程限制(您可以更新属性,但不能 集合)。要解决此问题,请使用Dispatcher.BeginInvoke() 在继续操作的同时更新UI线程上的集合 在后台线程。
我创建了ObservableCollection并将其附加到我的ListBox的ItemSource:
private ObservableCollection<Employee> employeeList;
searchList.ItemsSource = employeeList;
我创建一个线程并指示它运行填充ObservableCollection的函数(我正在传递文本字符串和ObservableCollection):
Thread thread = new Thread(() => ldapConnector.Search(textbox.Text, employeeList));
thread.Start();
当我启动程序时,ldapConnector是我初始化的一个单独的类。然后我得到以下错误(指向线程创建行):
调用线程无法访问此对象,因为它不同 线程拥有它。
正如我从该帖子中所理解的那样,我需要在创建线程后立即运行Begin.Invoke()方法:
Dispatcher.BeginInvoke(new Action(()=>{
searchList.ItemsSource = employeeList;
}));
我做错了什么以及如何解决?