2012-11-09 18 views
0

這裏就是我想實現(在.NET 4 WPF客戶端):如何使用RX驗證用戶輸入

  1. 用戶類型一些文本的文本框中
  2. 後半秒不再打字,文本被異步發送到服務器進行驗證
  3. 向用戶顯示驗證結果(這只是文本綁定到文本塊)
  4. 如果用戶在驗證時輸入更多文本正在進行中(這需要幾秒鐘),服務器的結果將被忽略,並且一個新的驗證請求被選中NT代替

從我讀過的反應擴展是非常適合這一點,但我有麻煩,尤其是第4步

其次我使用的MVVM,所以我怎麼把這個邏輯在視圖模型中,同時在視圖中訂閱TextBox.TextChanged。

+0

如果您是Rx的新手,這可能會過於陡峭的學習曲線,但是當您使用Rx和WPF時,[ReactiveUI](http://www.reactiveui.net/)非常棒。所以這可能值得一試。 – Wilka

回答

3

在這裏有一些運營商相當方便(特別是,Throttle 2和Switch爲4)。您的視圖模型看起來類似:

Class ViewModel 
    Implements INotifyPropertyChanged 
    Implements IDisposable 'to clean up subscription 

    Public Sub New() 
     _subscription = Observable.FromEventPattern(Of PropertyChangedEventHandler, PropertyChangedEventArgs)(
          Sub(h) AddHandler Me.PropertyChanged, h, 
          Sub(h) RemoveHandler Me.PropertyChanged, h) _ 
         .Where(Function(ep) String.Equals(ep.EventArgs.PropertyName, "Input", StringComparison.Ordinal)) _ 
         .Throttle(TimeSpan.FromSeconds(0.5)) _ 
         .Select(Function(ep) Validate(Me.Input)) _ 
         .Switch() _ 
         .ObserveOnDispatcher() _ 
         .Subscribe(Sub(v) Me.Output = v) 
    End Sub 

    Private ReadOnly _subscription As IDisposable 

    'put in actual code to notify on change 
    Public Property Input As String 
    Public Property Output As ValidationResult 

    Private Function Validate(toValidate As String) As IObservable(Of ValidationResult) 
     'start validation 
    End Function 

    Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged 
End Class 

從視圖,綁定的文本框中輸入和設置綁定模式的PropertyChanged(而不是默認的引發LostFocus)。結果塊可以綁定到輸出。

+0

謝謝,很好的回答,Switch正是我所需要的。 – Iain