出于这个问题的目的,我有一个带有以下XAML的简单窗口:
<&的StackPanel GT; < TextBox Text =“{Binding MyText}”/> < CheckBox IsChecked =“{Binding IsChecked}”& …
处理这类问题是否有良好的做法?
如果你想要发生两次保存,那么用锁定序列化它们(或者 SemaphoreSlim )是要做的方法。如果您想阻止第二次保存启动,那么正常的方法是在保存正在进行时禁用这些控件,例如,通过 IsBusy 与数据绑定到UI的属性。
SemaphoreSlim
IsBusy
注意事项:
finally
这是Rx的绝佳示例。如果你不想使用 ReactiveUI (它可以很容易地存在于MVVMLight旁边),你需要的只是一个属性改变的信号。
使用RxUI:
this.WhenAnyValue(x => x.MyText, x => x.IsChecked) // this you will need to emulate if you don't want RxUI .Throttle(TimeSpan.FromMilliseconds(150)) // wait for 150ms after last signal, if there isn't any, send your own further into pipeline .Synchronize() .Do(async _ => await Save()) // we have to await so that Synchronize can work .Subscribe();
这将在最后一次MyText更改或IsChecked更改后等待150ms,然后执行保存一次。
此外,RxUI具有非常巧妙的ICommand实现,它支持开箱即用的异步工作,包括在工作期间禁用命令。