2016-02-29 72 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方法的參數。