2016-02-29 75 views
1

我的应用程序是一个winforms应用程序,它引用了ReactiveUI 6.5。我想在用户在TextBox中输入“Exit”时关闭窗口,但由于某种原因没有任何反应。ReactiveUI WhenAnyObservable不适用于我

这是我的看法:

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

回答

1

在您的视图模型,你应该说明你的退出命令和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; } 
} 
0

你已经差不多了,除了没有什么东西在告诉你的ExitCmdExecute。您传递给ReactiveCommand.Create的值是canExecute属性。你应该把它改成这样:

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

InvokeCommand实际执行的命令参数,从可观察序列传递每个值到ExecuteAsync方法的参数。