マイComboBox
にSourceUpdated結合操作の取り消し:は、コンボボックス
<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;
を、デバッガでIそれが実際にSelectedValueMember値を更新していることがわかりますが、ComboBoxは変更されません。新しい値に保持されます。
アイデア?
AngelWPFの作品以下の答えとは、おそらくneatestと明確な方法です。
私はしかし、非自明な解決策を見つけた:
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
によって第2のUIスレッド上で操作を置くことによって、それが動作します!私は間違っている可能性がありますが、私は、更新ループのバインディングを避けるために、ソース/ターゲット更新ハンドラのアクションはバインディングによって反応しないということです。
SelectedValueMemberで 'PropertyChanged'を発生させますか?あるいはそれは 'DependencyProperty'です。 – Silvermind
はい、PropertyChangedイベントが発生します。テストを行い、MyDataContext.SelectedValueMemberの値を変更する唯一の目的で単純なボタンを接続すると、ソースとターゲットのバインディングがうまく動作し、ComboBoxが更新されます。 – Ross
似たような質問と回答があります:http://stackoverflow.com/questions/2585183/wpf-combobox-selecteditem-change-to-previous-value/2709931#2709931私はエンジェルの答えはおそらく最高だと思うが、バインディングで明示的なモードにしたくない場合は、BeginInvokeを使うこともできます。 – NathanAW