c# - 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.Run
inside 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>
然后,您在视图模型中的命令将阻塞 UI 并调用异步功能。
推荐阅读
- node.js - 在节点 js 中使用 HEX 和 Ascii 编码进行 Tourble
- python - 使用 selenium 进行网络抓取 Python 时的循环
- python - 关于 colab - class_weight 导致 ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
- swiftui - SwiftUI:错误“无法推断复杂的闭包返回类型”似乎随意出现
- python - 从 python.org 安装创建 conda 环境
- docker - Docker 内部 DNS 解析内部服务名称很慢
- amazon-web-services - 是否可以忽略使用 AWS CDK 创建的部署的 CodeDeploy 部署错误?
- javascript - Javascript:如何设置响应对象标头?
- c# - Unity - 从另一个场景打开时重力不起作用
- javascript - 搜索/排序/过滤操作时的非阻塞 UI