我正在构建一个WPF应用程序,当我需要过滤ListBox时,我陷入困境。我显然有一个文本框供用户输入过滤字符串,我使用RX来处理它。
filterBox = Observable.FromEventPattern<TextChangedEventHandler, TextChangedEventArgs>(
h => this.filterText.TextChanged += h,
h => this.filterText.TextChanged -= h)
.Throttle(new TimeSpan(0, 0, 0, 0, 750))
.ObserveOnDispatcher()
.Subscribe(t => this._datacontext.DoFiltering(this.filterText.Text));
filterText是TextBox。 DoFiltering是viewmodel中用于进行过滤的方法。
public void DoFiltering(string t)
{
DataView vw = _bks.clienteView;
vw.RowFilter = String.Format(@"(CFPIva LIKE '%{0}%' OR
Nominativo LIKE '%{0}%')", t);
Dati = vw;
}
Dati是ListBox ItemsSource属性绑定到的属性。
问题是ListBox可以包含数万个元素,据我所知,我的代码在主线程上执行过滤。这可能会挂起UI。
那么,如何在另一个线程/任务中执行过滤?最好使用RX而已? Do运营商?
此外,DataView中的过滤如何在引擎盖下工作?一旦我设置了RowFilter属性,它就会启动过滤操作吗?