0

これが私が達成しようとしているものです(.Net 4 WPFクライアントで):

  1. ユーザーがテキスト ボックスにテキストを入力する
  2. 0.5 秒以上入力しないと、テキストが非同期に送信され、検証のためにサーバーに送信されます。
  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 に答える