这是我要实现的目标(在.NET 4 WPF客户端中):
- 用户在文本框中键入一些文本
- 在不再键入的半秒之后,文本将异步发送到服务器进行验证
- 验证结果已显示给用户(这只是绑定到文本块的文本)
- 如果用户在进行验证时键入更多文本(这需要几秒钟),则忽略了服务器的结果,而发送了新的验证请求
根据我阅读的反应性扩展非常适合此功能,但我遇到了麻烦,特别是步骤4。
。其次,我使用的是MVVM,那么如何将此逻辑放在视图模型中,订阅textbox.textchanged在视图中。
在这里有几个操作员非常方便(尤其是Throttle
for 2,而 Switch
for 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
从视图中,将文本框绑定到输入并将绑定模式设置为属性换议(而不是默认的丢失方面)。结果块然后可以绑定到输出。