首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF ICollectionView刷新

WPF ICollectionView刷新
EN

Stack Overflow用户
提问于 2009-08-05 11:17:14
回答 3查看 6.6K关注 0票数 1

有没有办法

代码语言:javascript
复制
ICollectionView.Refresh() 

代码语言:javascript
复制
CollectionViewSource.GetDefaultView(args.NewValue).Refresh();

单独的线程中?

我知道我可以使用dispatcher,但是这个集合绑定到一个ListView,它会抛出跨线程异常。

我需要第二个线程的原因是,我拥有一个显示IMyItems列表的Control。当过滤此集合(通过用户文本更改输入)时,我希望能够显示CollectionView正在更改的动画。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-06 04:01:09

你不能!

所有UI操作都必须在用户界面线程上进行,WPF的DispatcherObject (以及该层次结构中的所有控件)中的几乎每个调用都将定期调用CheckAccess()。

如果您正在后台线程或ObservableCollection中进行处理,您可能需要考虑使用一个BackgroundWorker来帮助您的数据保持最新。

票数 3
EN

Stack Overflow用户

发布于 2009-08-05 12:05:56

使用调度程序来处理后台优先级如何?

代码语言:javascript
复制
Dispatcher.Invoke(DispatcherPriority.Background,
    () => { CollectionViewSource.GetDefaultView(args.NewValue).Refresh(); }
);
票数 3
EN

Stack Overflow用户

发布于 2009-08-05 11:26:11

我盗用了一种快速方法来调用wpf可调度对象上的操作(所有wpf控件都继承自DispatcherObject)。

代码语言:javascript
复制
public static void InvokeWpf(DispatcherObject dispatchable, Action action, bool async)
{
    // DispatcherOperationCallback is optimized for wpf invoke calls
    DispatcherOperationCallback toDo = delegate{ action(); return null; };

    if (!dispatchable.CheckAccess())
    {
        if (async) 
            dispatchable.Dispatcher.BeginInvoke(toDo, null);
        else
            dispatchable.Dispatcher.Invoke(toDo, null);
    }
    else
    {
        toDo(null);
    }
}

用法:

代码语言:javascript
复制
InvokeWpf(listView, 
       () => CollectionViewSource.GetDefaultView(listView).Refresh(), 
       false);
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1232610

复制
相关文章

相似问题

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