【发布时间】:2018-07-03 13:45:33
【问题描述】:
当从双向绑定控件(例如组合框(wpf 数据绑定))中选择项目时,处理运行异步操作的适当方法是什么?
当我有一个双向绑定属性(例如 ComboBox 上的 SelectedValue)时,我认为我不能使用 Stephen Cleary's NotifyTaskCompletion,因为当用户从下拉列表中选择一个值时,ComboBox 本身需要修改绑定的 Result属性,即Task的结果。
我想出的唯一可行的解决方案是从数据绑定设置器调用异步 Task 方法而不等待结果。这应该没问题,只要异步方法为正在执行的任何与 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)上的双向绑定。
【问题讨论】:
-
我遇到了类似的问题,但是不等待就运行异步是不够的。例外情况如何?但还没有找到更好的解决方案。
标签: wpf asynchronous combobox properties async-await