我ComboBox
一個SourceUpdated綁定操作:撤消上一個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
}
}
我有難以恢復的組合框回到其原始值(在「 TODO「評論我上面的代碼)。
我想是簡單地改回在DataContext的SelectedValueMember的價值,假設第一和最明顯的東西結合將更新組合框:
MyDataContext.SelectedValueMember = original_value;
當我做到這一點,在調試器我可以看到它確實正在更新SelectedValueMember值,但ComboBox不會變回 - 它保留在新值上。
任何想法?
AngelWPF的回答下面的作品,並可能是最整潔和清晰的方式。
我也不過,找到一個非顯而易見的解決方案:只需通過將操作的第二UI線程通過BeginInvoke
手段
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;
}));
}
}
,它的作品!我可能是錯的,但我的直覺是爲了避免綁定更新循環,直接在源/目標更新處理程序中的操作不會被綁定反應。
您是否在SelectedValueMember上提升'PropertyChanged'?或者它是一個'DependencyProperty'。 – Silvermind 2012-03-13 14:33:32
Yep一個PropertyChanged事件引發。如果我測試並連接一個簡單的按鈕,其唯一目的是更改MyDataContext.SelectedValueMember的值,那麼源目標綁定工作正常,ComboBox更新。 – Ross 2012-03-13 14:41:09
這裏有一個類似的問題和答案:http://stackoverflow.com/questions/2585183/wpf-combobox-selecteditem-change-to-previous-value/2709931#2709931。我認爲Angel的答案可能是最好的,但如果你不想在綁定上使用顯式模式,那麼使用BeginInvoke也可以。 – NathanAW 2012-03-13 15:43:44