WPF BackgroundWorker的ListView的过滤器问题

我有一个WPF的ListView,我想一个BackgroundWorker中进行筛选。 我的代码如下所示:

Dim Worker As New BackgroundWorker AddHandler Worker.DoWork, AddressOf Me.FilterAsync Me.TextBoxText = Me.TextBox.Text Worker.RunWorkerAsync(Me.TextBox) Private Sub FilterAsync(ByVal sender As Object, ByVal e As DoWorkEventArgs) ' Dim BackgroundWorker As BackgroundWorker = CType(sender, BackgroundWorker) Dim Text As String = e.Argument.ToString ' Dim ListView As ListCollectionView = CType(CollectionViewSource.GetDefaultView(Me.ListView.ItemsSource), ListCollectionView) If Text <> String.Empty Then ListView.Filter = New Predicate(Of Object)(AddressOf Me.FindItemsAsync) Else ListView.Filter = Nothing End If ' End Sub

通过过滤但它失败,错误此代码运行“调用线程不能访问此对象,因为不同的线程拥有它。” 以下行:

ListView.Filter = New Predicate(Of Object)(AddressOf Me.FindItemsAsync)

会是什么问题吗? 我似乎无法找到任何样品通过BackgroundWorker的过滤。

更新:有谁知道,过滤器使用一个BackgroundWorker一个WPF的ListView的样本?

--------------解决方案-------------

我猜运行过滤器将需要很长的时间,所以要在后台线程中运行过滤代码 - 这是不可能的。

代码,讨论到UI(包括设置过滤器和过滤器中的代码)必须在UI线程中运行。

你可以做的是,BackgroundWorker的代码中,创建一个新的名单,其中包括只需要被过滤的,然后在项目,BackgroundWorker的完成后你回来在UI线程,设置新的列表Lis​​tView的ItemSource 。

一个ListCollectionView绑定到一个控制只能从创建它的线程访问。 所以,你可以只设置Filter的UI线程上的财产?

正如托马斯指出,在评论中,这种做法完全是假寐为WPF,它的WinForms的方法

建立在托马斯的回答,如果后台线程需要更新UI则需要先切换到其创建的UI线程。

为简单起见,你可以把一个“UI线程”,然后选择“后台线程”的。 在UI线程负责绘制的东西到屏幕上,处理用户交互等...呼叫从修改UI可能会导致各种混乱的后台线程,因此开始在.NET 2.0(或者1.1)的默认行为是抛出一个异常,而不是允许潜在的危险调用成功。

通常情况下(至少在2.0的世界),你做到这一点,“Invoke'ing”表格/控制,你需要更新,“调用”是一个有点暧昧的框架,但在用户界面的情况下控制它的意思是“回归UI线程“。

在2.0中使用的典型模式做这将是大致相同的:

Private DelegateSub UpdateSomeUICaller()
Private Sub UpdateSomeUI()
If Me.InvokeRequired Then
Dim delg as new UpdateSomeUICaller(AddressOf UpdateSomeUI)
Me.Invoke(delg)
Exit Sub
End If

Me.SomeUiControl.Text = "Hello from the UI Thread!"

End Sub

一个大的警告:“delg”中的示例对象还包含一个“调用”成员, 是不是你要找的Invoke方法,需要“调用(delg)”,而不是“delg.Invoke()” - - 这就是我提到的歧义

分类:。净 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.061 (s). 10 q(s)