首页 > 解决方案 > MVVM 在选择更改时调用异步方法

问题描述

我有一个简单的列表框,其中选定的项目绑定到 ViewModel 的属性

<ListBox SelectedItem="{Binding SelectedItem, Mode=TwoWay}">

我有一个异步方法,我想在选择更改时运行

async Task foo();

我可以把这个调用放在 setter 中,SelectedItem但这对我来说是一种代码味道。

public object SelectedItem
{
    get{...}
    set
    {
         foo(); //Compiler warning and blocks UI
         ...
    }
}

Task.Runinside set 是一个选项,但对我来说仍然看起来很糟糕,并且抛出的异常foo会膨胀

事件背后的代码SelectionChanged可能是另一种选择,但解决这个问题的最 MVVM 方法是什么?

标签: c#wpfmvvm

解决方案


如果您想要使用零代码的方法,这就是我要做的。

使用交互将 SelectedItemChanged 事件转换为命令。

这是有关如何将事件转换为命令的代码

   <i:Interaction.Triggers>
        <i:EventTrigger EventName="SomeEvent">
            <i:InvokeCommandAction Command="{Binding Path=SomeCommand, Mode=OneWay}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>

然后,您在视图模型中的命令将阻塞 UI 并调用异步功能。


推荐阅读