gpt4 book ai didi

c# - 响应式扩展即时搜索 WPF/MVVM

转载 作者:行者123 更新时间:2023-11-30 14:56:18 24 4
gpt4 key购买 nike

我想实现一个 TextBox,在您键入时,结果会立即出现在另一个 ListBox 中。我一直在寻找 Reactive Extensions (Rx) 的示例,我找到的所有示例都使用 Observable.FromEventPattern() 以及 TextBox 的 TextChanged 事件:

我将 WPF 与 MVVM 结合使用,因此我无法直接访问 TextBox 或其事件。

我也偶然发现了 this answer它展示了如何在 MVVM 设置中使用 Observable.FromEventPattern(),但我希望有比捕获每个 PropertyChanged 事件更好的东西。

Observable.FromEventPattern() 有什么好的替代方法可以很好地与 WPF/MVVM 配合使用?

最佳答案

得到这个与 ReactiveUI 一起工作.

解决方案基于 blog postReactiveUI ,但是代码里面有点out of date .我正在主持 solution在 BitBucket 上以便于访问。它使用 ReactiveUI 5.5.1。

这是该解决方案中的 ViewModel。 SearchText 绑定(bind)到用户键入查询的 View 中的 TextBox,而 SearchResults 绑定(bind)到 ListBox 显示结果。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Reactive.Linq;
using System.Windows.Input;

using ReactiveUI;

namespace ReactiveExtensionsSearch
{
public class MainWindowViewModel : ReactiveObject
{
private string[] _repository = new string[]
{ "Mario", "Maria", "Gigi", "Jack", "James", "Jeremy" };
private ObservableAsPropertyHelper<ObservableCollection<string>> _searchResults;
private string _searchText;
private ICommand _executeSearchCommand;

public string SearchText
{
get
{
return _searchText;
}
set
{
this.RaiseAndSetIfChanged(ref _searchText, value);
}
}

public ObservableCollection<string> SearchResults
{
get
{
return _searchResults.Value;
}
}

public MainWindowViewModel()
{
var executeSearchCommand = new ReactiveCommand();
var results = executeSearchCommand.RegisterAsyncFunction(s => { return ExecuteSearch(s as string); });
_executeSearchCommand = executeSearchCommand;

this.ObservableForProperty<MainWindowViewModel, string>("SearchText")
.Throttle(TimeSpan.FromMilliseconds(800))
.Select(x => x.Value)
.DistinctUntilChanged()
.Where(x => !string.IsNullOrWhiteSpace(x))
.Subscribe(_executeSearchCommand.Execute);

_searchResults = new ObservableAsPropertyHelper<ObservableCollection<string>>(results, _ => raisePropertyChanged("SearchResults"));
}

private ObservableCollection<string> ExecuteSearch(string searchText)
{
var q = from s in _repository where s.ToLower().StartsWith(searchText.ToLower()) select s;
var results = new ObservableCollection<string>(q);
return results;
}
}
}

关于c# - 响应式扩展即时搜索 WPF/MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23168500/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com