【问题标题】:ReactiveUI WhenAnyObservable doesn't work for meReactiveUI WhenAnyObservable 对我不起作用
【发布时间】:2016-02-29 15:54:46
【问题描述】:

我的应用程序是一个 winforms 应用程序,它引用 ReactiveUI 6.5。当用户在 TextBox 中键入“退出”时,我试图关闭窗口,但由于某种原因没有任何反应。

这是我的观点:

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"));
    }
}

【问题讨论】:

    标签: reactiveui


    【解决方案1】:

    在你的 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; }
    }
    

    【讨论】:

      【解决方案2】:

      您几乎得到了它,除了没有什么告诉您的 ExitCmdExecute。您传递给ReactiveCommand.Create 的值是canExecute 属性。你应该把它改成这样:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-29
        • 2015-03-05
        相关资源
        最近更新 更多