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

时间:2018-01-24 13:32:57

标签: wpf asynchronous combobox properties async-await

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

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

我提出的唯一可行的解​​决方案是在不等待结果的情况下从数据绑定设置器调用异步任务方法。只要async-method为任何与ui相关的东西进行触发属性更改事件,并且任何异常都被相应地传播到ui,对吗?

我认为这是异步WPF应用程序中的常见情况。你们是怎么做到的?

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

<ComboBox 
        ItemsSource="{Binding PossibleItems}"
        DisplayMemberPath="Name"
        SelectedValue="{Binding SelectedItem}"/>

...

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();
    }
}

注意:我发现了类似的问题,但是没有一个问题可以解决对象上的双向绑定问题,例如Combobox。

2 个答案:

答案 0 :(得分:1)

如果您正在使用功能性反应性MVVM框架,例如ReactiveUI,您只需观察SelectedItem属性,并在设置属性时启动所需的任何操作。 e.g:

this.WhenAnyValue(x => x.SelectedItem)
    .Subscribe(async _ => await InitializeAsyncAndFirePropertyChanged());

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

有关详细信息,请参阅文档:https://reactiveui.net/docs/concepts/

答案 1 :(得分:0)

使用WCF数据绑定时,属性设置器中的jStat.???(1, 0.99) # == 63.67 jStat.???(10, 0.99) # == 3.17 jStat.???(1, 0.95) # == 12.69 调用存在类似的问题。 我的解决方案稍好一点,因为在您的情况下,async中发生异常时,不会引发或捕获异常。修改后的代码如下。它使用任务继续引发异常并引发InitializeAsyncAndFirePropertyChangedOnPropertyChanged通话可以留在原处,这取决于您的需求。

OnPropertyChanged