当从双向绑定的控件(例如 wpf 数据绑定中的 ComboBox)选择项目时,处理异步操作的适当方式是什么?
当我有一个双向绑定属性(例如 ComboBox 上的 SelectedValue)时,我认为我不能使用 Stephen Cleary's NotifyTaskCompletion ,因为当用户从下拉列表中选择一个值时,ComboBox 本身需要修改绑定的 Result 属性,这是 Task 的结果。
我想到的唯一可行的解决方案是,在数据绑定的 setter 中调用一个 async Task 方法,而不等待结果。只要 async 方法触发与正在进行的任何 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这样的控件的双向绑定。