如何从ViewModel正确执行异步方法?


诸葛神侯
2025-02-06 05:30:34 (6天前)


出于这个问题的目的,我有一个带有以下XAML的简单窗口:

<&的StackPanel GT;
< TextBox Text =“{Binding MyText}”/>
< CheckBox IsChecked =“{Binding IsChecked}”& …

3 条回复
  1. 0# 文艺青年3 | 2019-08-31 10-32




    处理这类问题是否有良好的做法?




    如果你想要发生两次保存,那么用锁定序列化它们(或者

    SemaphoreSlim

    )是要做的方法。如果您想阻止第二次保存启动,那么正常的方法是在保存正在进行时禁用这些控件,例如,通过

    IsBusy

    与数据绑定到UI的属性。



    注意事项:




    • 设置你的

      IsBusy

      财产同步。这会立即禁用控件。


    • 取消设置

      IsBusy

      在一个

      finally

      ,即使发生错误,也要确保始终未设置。


  2. 1# 1号 | 2019-08-31 10-32



    这是Rx的绝佳示例。如果你不想使用

    ReactiveUI

    (它可以很容易地存在于MVVMLight旁边),你需要的只是一个属性改变的信号。



    使用RxUI:




    1. 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();

    2. </code>


    这将在最后一次MyText更改或IsChecked更改后等待150ms,然后执行保存一次。



    此外,RxUI具有非常巧妙的ICommand实现,它支持开箱即用的异步工作,包括在工作期间禁用命令。


登录 后才能参与评论