我有这个:
我尝试在BackgroundWorker完成事件时更新UI,使用Dispatcher,使用DispatchTimer.所有这一切都显示了用户控件,但是ObservableCollection仍然需要添加。
试图向集合添加项的代码位于UserControl中。
确切的错误是:“这种类型的CollectionView不支持与Dispatcher线程不同的线程对其SourceCollection的更改”
如果我没有在后台进行加载,则不会发生这种情况。
谢谢你能解决这个问题。
顺便说一句,尝试使用Dispatcher添加项也不起作用。
换句话说,我想做的是在UI中创建一个对象,同时在后台.我知道这听起来很傻。
发布于 2011-11-23 07:09:02
您可能需要检查您使用的是哪个Dispatcher?在您的例子中,您可能指的是两个不同的分配器。
为什么不使用线程安全可观察集呢?
发布于 2011-11-23 14:26:25
通常,我将在UI线程上创建对象,然后用从后台线程获得的数据填充它们。
例如,
void async LoadButton_Clicked(object sender, EventArgs e)
{
MyCollection = new ObservableCollection<SomeItem>();
// Can also use a BackgroundWorker
var collectionData = await GetCollectionData();
foreach(var item in collectionData)
{
MyCollection.Add(item);
}
}我使用C# 5.0 async和await关键字进行异步操作,但您也可以使用执行后台工作的BackgroundWorker。
您还可以使用Dispatcher.BeginInvoke()进行一些较轻的后台工作(例如将数据复制到MyCollection),尽管对于繁重的工作,我发现它仍然会锁定UI,所以我更喜欢使用后台线程。
发布于 2011-11-22 18:08:31
如果视图绑定到此集合,则不可能在单独的线程上修改ObservableCollection的内容,相反,您可以重写ObservableCollection并提供对它的支持,并在应用程序中使用它。
此示例包含您想要的内容- http://tomlev2.wordpress.com/2009/04/17/wpf-binding-to-an-asynchronous-collection/
https://stackoverflow.com/questions/8231425
复制相似问题