【问题标题】:ReactiveUI: React to changes of a propertyReactiveUI:对属性的更改做出反应
【发布时间】:2016-08-22 18:39:09
【问题描述】:

我正在使用 ReactiveUI 迈出第一步,但我无法获得一个非常基本的示例来工作。我想在属性“SearchTerm”更改后立即执行任务。我按照ReactiveUI(“一个令人信服的例子”)的github页面上的说明进行操作。

我有一个带有 SearchTerm 属性的 ViewModel,它在我的视图中绑定到一个 TextBox。如果我更新 TextBox 的内容,则属性会按预期更新(我使用了UpdateSourceTrigger=PropertyChanged)。

我的 observables 中的代码永远不会触发:

public class MainWindowViewModel: ReactiveObject
{
    public string SearchTerm
    {
         get { return m_SearchTerm; }
         set { this.RaiseAndSetIfChanged(ref m_SearchTerm, value); }
    }

    private string m_SearchTerm;

    public MainWindowViewModel()
    {
        SearchResults = new List<string>();

        var canSearch = this.WhenAny(x => x.SearchTerm, x => !string.IsNullOrWhiteSpace(x.GetValue()));

         var search = ReactiveCommand.CreateAsyncTask(canSearch,
                async _ => {
                    // this is never called
                    return await dosearch(this.SearchTerm);
                });

            search.Subscribe(results => {
                // this is never called too
                SearchResults.Clear();
                SearchResults.AddRange(results);
            });
        }

        private async Task<List<string>> dosearch(string searchTerm)
        {
            await Task.Delay(1000);

            return new List<string>() { "1", "2", "3" };
        }

        public List<string> SearchResults { get; private set; }
    }

【问题讨论】:

    标签: c# wpf reactiveui


    【解决方案1】:

    您的命令中的代码永远不会触发,因为您没有在任何地方调用该命令。您必须将您的命令绑定到任何事件(如输入文本更改、按钮单击等)。

    首先,从ViewModel 公开您的命令:

    public ReactiveCommand<List<string>> Search { get; private set; }
    

    接下来,在构造函数中赋值:

    this.Search = ReactiveCommand.CreateAsyncTask(canSearch,
                    async _ => {
                        return await dosearch(this.SearchTerm);
                    });
    

    最后,当输入改变时调用命令(这是代码中关键的缺失部分):

    this.WhenAnyValue(x => x.SearchTerm)
        .InvokeCommand(this, x => x.Search);
    

    将上面的代码放入构造函数中。

    请注意,这将在用户键入时不断触发搜索。要解决此问题,您可以使用名为 Throttleas seen in the example you linked to 的 Rx 运算符。

    【讨论】:

    • 太棒了!谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    相关资源
    最近更新 更多