如何使用rx验证用户输入

时间:2012-11-09 21:28:10

标签: .net wpf system.reactive

这是我想要实现的目标(在.Net 4 WPF客户端中):

  1. 用户在文本框中键入一些文字
  2. 在不再输入的半秒后,文本被异步发送到服务器进行验证
  3. 向用户显示验证结果(这只是绑定到文本块的文本)
  4. 如果用户在验证过程中输入更多文本(这需要几秒钟),服务器的结果将被忽略,并且会发送新的验证请求
  5. 从我所看到的反应性扩展非常适合这种情况,但我遇到了麻烦,特别是第4步。

    其次我使用的是mvvm,所以如何在视图中订阅TextBox.TextChanged时将此逻辑放在视图模型中。

1 个答案:

答案 0 :(得分:4)

一些运营商在这里非常方便(值得注意的是,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

从视图中,将文本框绑定到Input并将绑定模式设置为PropertyChanged(而不是默认的LostFocus)。然后结果块可以绑定到Output。