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を実行する方法はありますか?PreviewLostKeyboardFocusLostFocus
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");
}
}
}
ありがとう!