我有一个简单的列表框,其中选定的 Item 绑定(bind)到 ViewModel 的属性
<ListBox SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
我有一个异步方法,我想在选择更改时运行该方法
async Task foo();
我可以将此调用放在 SelectedItem
的 setter 中,但这对我来说是一种代码味道。
public object SelectedItem
{
get{...}
set
{
foo(); //Compiler warning and blocks UI
...
}
}
Task.Run
里面的 set 是一个选项,但对我来说仍然看起来很糟糕,并且 foo
抛出的异常将会膨胀
SelectionChanged
事件背后的代码可能是另一种选择,但解决此问题的最 MVVM 方法是什么?
最佳答案
如果您想要零代码隐藏的方法,这就是我要做的。
使用交互将 SelectedItemChanged 事件转换为命令。
这里是有关如何将事件转换为命令的代码
<i:Interaction.Triggers>
<i:EventTrigger EventName="SomeEvent">
<i:InvokeCommandAction Command="{Binding Path=SomeCommand, Mode=OneWay}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
View 模型中的命令将阻止 UI 并调用异步功能。
关于c# - MVVM 在选择更改时调用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52446129/