ReactiveUI WhenAnyObservable 对我不起作用

ReactiveUI WhenAnyObservable doesn't work for me

我的应用程序是一个 winforms 应用程序,它引用了 ReactiveUI 6.5。当用户在文本框中键入 "Exit" 时,我试图关闭 window,但由于某种原因没有任何反应。

这是我的观点:

public partial class HomeView : Form, IViewFor<HomeViewModel>
{
    public HomeView()
    {
        InitializeComponent();
        ViewModel = new HomeViewModel();

        this.Bind(ViewModel, x => x.EnteredText, x => x.textBox.Text);
        this.ViewModel.WhenAnyObservable(x => x.ExitCmd).Subscribe(_ => this.Close());

    }

    object IViewFor.ViewModel
    {
        get { return ViewModel; }
        set { ViewModel = (HomeViewModel)value; }
    }

    public HomeViewModel ViewModel { get; set; }
}

这是我的 ViewModel:

 public class HomeViewModel : ReactiveUI.ReactiveObject
{
    string _text;
    public string EnteredText
    {
        get { return _text; }
        set { this.RaiseAndSetIfChanged(ref _text, value); }
    }

    public ReactiveCommand<object> ExitCmd { get; private set; }

    public HomeViewModel()
    {
        ExitCmd = ReactiveCommand.Create(this.WhenAny(x => x.EnteredText, y => y.Value == "Exit"));
    }
}

在你的 ViewModel 中,你应该描述你的 Exit Command 和 EntertedText 之间的关系

public class HomeViewModel : ReactiveUI.ReactiveObject
        {
            private string _text;
            public string EnteredText
            {
                get { return _text; }
                set { this.RaiseAndSetIfChanged(ref _text, value); }
            }

            public ReactiveCommand<object> ExitCmd { get; private set; }

            public HomeViewModel()
            {
                ExitCmd = ReactiveCommand.Create();
                this.WhenAny (x => x.EnteredText, x => x.Value == "Exit")
                .Where(k => k == true)
                .DistinctUntilChanged()
                .InvokeCommand (ExitCmd);
            }
        }

那么在你看来,订阅就可以了

public partial class HomeView : Form, IViewFor<HomeViewModel>
{
    public HomeView()
    {
        InitializeComponent();
        ViewModel = new HomeViewModel();

        this.Bind(ViewModel, x => x.EnteredText, x => x.textBox.Text);
        this.ViewModel.ExitCmd.Subscribe (_ => this.Close());

    }

    object IViewFor.ViewModel
    {
        get { return ViewModel; }
        set { ViewModel = (HomeViewModel)value; }
    }

    public HomeViewModel ViewModel { get; set; }
}

您几乎已经搞定了,除了没有任何信息告诉您的 ExitCmdExecute。您传递给 ReactiveCommand.Create 的值是 canExecute 属性。您应该将其更改为:

ExitCmd = ReactiveCommand.Create();
this.WhenAnyValue(x => x.EnteredText)
    .Where(x => x == "Exit")
    .InvokeCommand(ExitCmd);

InvokeCommand实际执行命令参数,将可观察序列中的每个值作为参数传递给ExecuteAsync方法。