Window
データエディターを表すWPFがあります。のDataContext
は、Window
(を実装する)監視可能なオブジェクトのものINotifyPropertyChanged
です。
監視可能なオブジェクトの各プロパティは、Window
(TextBox
数値タイプのCheckBox
場合bool
、などの場合)の適切なウィジェットにバインドされます。
変更されたプロパティを保持するために[OK]ボタンと[キャンセル]ボタンは必要ありません。ウィジェットがフォーカスを失ったときに、基になるデータを監視可能なオブジェクトに保持したいと思います。
これを行うために、ウィジェットのイベントPreviewLostKeyboardFocus
とイベントを処理しました。LostFocus
私のundoフレームワークには、現在の状態を表す監視可能なオブジェクトのコピーと、新しい状態のコピーが必要です。イベントはオブジェクトのPreviewLostKeyboardFocus
コピーを作成し、LostFocus
イベントは実際にデータベースへの保存を実行します。
しかし、私の問題はこれです。フィールドのバインディングは、イベントが実行されるまで、基になる監視可能なオブジェクトを実際には更新しません。LostFocus
正味の効果は、aのテキストをTextBox
「A」から「B」に変更すると、フィールドのデータが「A」として保持されることです。「A」から「B」、「C」に変更すると、「B」が持続します。
イベントハンドラーと基になるオブジェクトのセッターにブレークポイントを設定しました。案の定、PreviewLostKeyboardFocus
最初に実行し、次に実行LostFocus
し、最後に監視可能なオブジェクトのセッターを実行します。
これをできるだけ一般的にしたいので、オブザーバブルオブジェクトにKeyboardFocusChangedEventArgs
、を使用して独自のプロパティを更新するように指示することはできますが、フィールドごとに個別のイベントハンドラーが必要であり、かなりの数になる可能性があります。
とイベントの間でBinding
を実行する方法はありますか?PreviewLostKeyboardFocus
LostFocus
XAML:
<TextBox Text="{Binding ObjectProperty, StringFormat='{}{0:F5}'}" LostFocus="PersistentTextBox_LostFocus" PreviewLostKeyboardFocus="PersistentTextBox_PreviewLostKeyboardFocus" />
コードビハインドのイベントハンドラー:
private void PersistentTextBox_LostFocus(object sender, RoutedEventArgs e) {
this.ObservableObject.PersistChanges(this.tempObservableObject);
}
private void PersistentTextBox_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
this.tempObservableObject = this.ObservableObject;
}
ObservableObject
クラス(セッター):
public class ObservableObject : INotifyPropertyChanged {
...
public Single ObjectProperty {
get {
return this._objectProperty;
}
set {
this._objectProperty = value;
RaisePropertyChanged("ObjectProperty");
}
}
}
ありがとう!