c# - MVVM 在选择更改时调用异步方法

标签 c# wpf mvvm

我有一个简单的列表框,其中选定的 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/

相关文章:

c# - 从 Javascript 触发回发失败

wpf - 使用数据契约进行哈希表序列化时出现的问题

画笔属性的 WPF ColorAnimation

c# - 将 UserControl ListBox ItemSsource 绑定(bind)到父 DataContext 时出错

mvvm - xamarin 表单卡在空白屏幕上

c# - 我可以将强制变量为 null 与 ?? 结合起来吗?运算符(operator)?

c# - 如何创建具有指定泛型类型的 func 类型?

C# SqlDataReader 仅返回值 > 0

ios - 如何在 Swift 的泛型中声明基类?

wpf - 通过绑定(bind)启用 TabItem