如何在双向绑定组合框 (WPF) 上调用异步操作

Ten*_*usG 5 wpf combobox asynchronous properties async-await

当从双向绑定控件(例如组合框(wpf 数据绑定))中选择项目时,处理运行异步操作的适当方法是什么?

当我有双向绑定属性(例如 ComboBox 上的 SelectedValue)时,我认为我无法使用Stephen Cleary 的 NotifyTaskCompletion ,因为当用户从下拉列表中选择一个值时,ComboBox 本身需要修改绑定的 Result 属性,这是任务的结果。

我想出的唯一可行的解​​决方案是从数据绑定设置器调用异步任务方法,而不等待结果。只要异步方法为正在执行的任何与 ui 相关的操作触发属性更改事件,并且任何异常都会相应地被拾取并传播到 ui,这应该没问题,对吗?

我认为这是异步 WPF 应用程序中的常见情况。你们如何处理这个问题?

到目前为止我的解决方案:

<ComboBox 
        ItemsSource="{Binding PossibleItems}"
        DisplayMemberPath="Name"
        SelectedValue="{Binding SelectedItem}"/>
Run Code Online (Sandbox Code Playgroud)

...

public Item SelectedItem
{
    get { return m_selectedItem; }
    set
    {
        m_selectedItem = value;
        OnPropertyChanged();

        InitializeAsyncAndFirePropertyChanged();   // async Task method not awaited - gives compiler warning CS4014
    }
}

public async Task InitializeAsyncAndFirePropertyChanged(ObservableCollection<RFEnvironment> possibleRfEnvironments)
{
    //should check this method for exceptions and propagate them to the UI via databinding
    OtherDataBoundProperty = await GetSomeStringFromWebAsync(); 
}

public string OtherDataBoundProperty
{
    get { return m_otherDataBoundProperty; }
    set
    {
        m_otherDataBoundProperty = value;
        OnPropertyChanged();
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:我发现有人提出类似的问题,但没有一个解决组合框等控件上的双向绑定问题。

mm8*_*mm8 0

如果您使用的是功能响应式 MVVM 框架(例如ReactiveUI ),您只需观察该SelectedItem属性并在设置该属性时启动您想要的任何操作。例如:

this.WhenAnyValue(x => x.SelectedItem)
    .Subscribe(async _ => await InitializeAsyncAndFirePropertyChanged());
Run Code Online (Sandbox Code Playgroud)

属性本身应该启动后台操作,但视图模型可以在设置属性时执行此操作。

请参阅文档以获取更多信息:https ://reactiveui.net/docs/concepts/ 。