0

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

  1. 用户在文本框中键入一些文本
  2. 半秒后不再打字,文本被异步发送到服务器进行验证
  3. 向用户显示验证结果(这只是绑定到文本块的文本)
  4. 如果用户在验证过程中输入更多文本(这需要几秒钟),来自服务器的结果将被忽略,而是发送一个新的验证请求

从我读过的内容来看,反应式扩展非常适合这个,但我遇到了麻烦,特别是第 4 步。

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

4

1 回答 1

4

一些运算符在这里非常方便(特别是Throttle2 和Switch4)。您的视图模型将类似于:

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)。然后结果块可以绑定到输出。

于 2012-11-09T22:59:58.283 回答