首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ObservableCollection上绑定后台操作块后的UI更新

在ObservableCollection上绑定后台操作块后的UI更新
EN

Stack Overflow用户
提问于 2011-11-22 17:58:06
回答 5查看 1.3K关注 0票数 0

我有这个:

  1. 显示在后台执行加载操作时等待“阻止”UI的动画。
  2. 在加载结束时,我调用一个方法,该方法实例一个用户控件,并使用绑定(和ObservableCollection等)显示一些数据。
  3. 这个用户控件将被显示,用户可以与它交互,但是ObservableCollection似乎被卡在另一个线程中,因为它不允许向它添加新的项。

我尝试在BackgroundWorker完成事件时更新UI,使用Dispatcher,使用DispatchTimer.所有这一切都显示了用户控件,但是ObservableCollection仍然需要添加。

试图向集合添加项的代码位于UserControl中。

确切的错误是:“这种类型的CollectionView不支持与Dispatcher线程不同的线程对其SourceCollection的更改”

如果我没有在后台进行加载,则不会发生这种情况。

谢谢你能解决这个问题。

顺便说一句,尝试使用Dispatcher添加项也不起作用。

换句话说,我想做的是在UI中创建一个对象,同时在后台.我知道这听起来很傻。

EN

回答 5

Stack Overflow用户

发布于 2011-11-23 07:09:02

您可能需要检查您使用的是哪个Dispatcher?在您的例子中,您可能指的是两个不同的分配器。

为什么不使用线程安全可观察集呢?

票数 1
EN

Stack Overflow用户

发布于 2011-11-23 14:26:25

通常,我将在UI线程上创建对象,然后用从后台线程获得的数据填充它们。

例如,

代码语言:javascript
复制
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 asyncawait关键字进行异步操作,但您也可以使用执行后台工作的BackgroundWorker

您还可以使用Dispatcher.BeginInvoke()进行一些较轻的后台工作(例如将数据复制到MyCollection),尽管对于繁重的工作,我发现它仍然会锁定UI,所以我更喜欢使用后台线程。

票数 1
EN

Stack Overflow用户

发布于 2011-11-22 18:08:31

如果视图绑定到此集合,则不可能在单独的线程上修改ObservableCollection的内容,相反,您可以重写ObservableCollection并提供对它的支持,并在应用程序中使用它。

此示例包含您想要的内容- http://tomlev2.wordpress.com/2009/04/17/wpf-binding-to-an-asynchronous-collection/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8231425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档