有没有办法
ICollectionView.Refresh() 或
CollectionViewSource.GetDefaultView(args.NewValue).Refresh();在单独的线程中?
我知道我可以使用dispatcher,但是这个集合绑定到一个ListView,它会抛出跨线程异常。
我需要第二个线程的原因是,我拥有一个显示IMyItems列表的Control。当过滤此集合(通过用户文本更改输入)时,我希望能够显示CollectionView正在更改的动画。
发布于 2009-08-06 04:01:09
你不能!
所有UI操作都必须在用户界面线程上进行,WPF的DispatcherObject (以及该层次结构中的所有控件)中的几乎每个调用都将定期调用CheckAccess()。
如果您正在后台线程或ObservableCollection中进行处理,您可能需要考虑使用一个BackgroundWorker来帮助您的数据保持最新。
发布于 2009-08-05 12:05:56
使用调度程序来处理后台优先级如何?
Dispatcher.Invoke(DispatcherPriority.Background,
() => { CollectionViewSource.GetDefaultView(args.NewValue).Refresh(); }
);发布于 2009-08-05 11:26:11
我盗用了一种快速方法来调用wpf可调度对象上的操作(所有wpf控件都继承自DispatcherObject)。
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);
}
}用法:
InvokeWpf(listView,
() => CollectionViewSource.GetDefaultView(listView).Refresh(),
false);https://stackoverflow.com/questions/1232610
复制相似问题