这是我想要实现的目标(在 .Net 4 WPF 客户端中):
- 用户在文本框中键入一些文本
- 半秒后不再打字,文本被异步发送到服务器进行验证
- 向用户显示验证结果(这只是绑定到文本块的文本)
- 如果用户在验证过程中输入更多文本(这需要几秒钟),来自服务器的结果将被忽略,而是发送一个新的验证请求
从我读过的内容来看,反应式扩展非常适合这个,但我遇到了麻烦,特别是第 4 步。
其次,我使用的是 mvvm,那么如何在视图中订阅 TextBox.TextChanged 时将此逻辑放入视图模型中。
这是我想要实现的目标(在 .Net 4 WPF 客户端中):
从我读过的内容来看,反应式扩展非常适合这个,但我遇到了麻烦,特别是第 4 步。
其次,我使用的是 mvvm,那么如何在视图中订阅 TextBox.TextChanged 时将此逻辑放入视图模型中。
一些运算符在这里非常方便(特别是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)。然后结果块可以绑定到输出。