Мой ComboBox
:
<ComboBox
SourceUpdated="MyComboBox_SourceUpdated"
ItemsSource="{Binding ...}"
SelectedValue="{Binding Path=SelectedValueMember, NotifyOnSourceUpdated=True}"
SelectedValuePath="..."
DisplayMemberPath="..."
/>
И мой SourceUpdated
обработчик:
private void MyComboBox_SourceUpdated(object sender, DataTransferEventArgs args) {
if (/* user answers no to an 'are you sure?' prompt */) {
// TODO: revert ComboBox back to original value
}
}
Мне трудно вернуть ComboBox к его первоначальному значению (в комментарии "TODO" моего кода выше).
Первая и самая очевидная вещь, которую я попытался, это просто изменить значение SelectedValueMember объекта DataContext, предполагая, что привязка обновит ComboBox:
MyDataContext.SelectedValueMember = original_value;
Когда я делаю это, в отладчике я вижу, что он действительно обновляет значение SelectedValueMember, но ComboBox не изменяется обратно - он сохраняет новое значение.
Есть идеи?
Ответ AngelWPF , приведенный ниже, работает и, вероятно, является самым аккуратным и ясным способом.
Однако я нашел неочевидное решение:
private void MyComboBox_SourceUpdated(object sender, DataTransferEventArgs args) {
if (/* user answers no to an 'are you sure?' prompt */) {
Dispatcher.BeginInvoke(new Action(() => {
MyDataContext.SelectedValueMember = original_value;
}));
}
}
Просто поместив операцию во второй поток пользовательского интерфейса с помощью BeginInvoke
, она работает! Я могу ошибаться, но моя догадка заключается в том, что во избежание связывания циклов обновления, действия непосредственно в обработчиках Обновление источника / цели не реагируют на привязки.