アプリと、いくつかのTabItemsを含むTabControlを備えた設定ウィンドウがあります。それらのそれぞれには、同じ Singleton オブジェクトにデータバインドされたいくつかのフィールド (テキストボックス) があります。
[保存] ボタンをクリックした後にのみ、データバインディングへのエレガントで WPF のような方法はありますか?
現在、テキストボックスの内容を変更した直後にデータバインドされており、シングルトンに古い値を持たせ、保存ボタンをクリックした後にのみ更新する必要があります。
3 に答える
DataBinding
の XAML で使用されるオブジェクトの場合、次のように値を持つプロパティをTextbox
使用します。UpdateSourceTrigger
Explicit
<TextBox Name="itemNameTextBox"
Text="{Binding Path=ItemName, UpdateSourceTrigger=Explicit}" />
UpdateSourceTrigger 値を Explicit に設定すると、ソース値は、アプリケーションが以下のようにUpdateSource
メソッドを呼び出したときにのみ変更されます (以下のコードを SaveClick
イベントに配置できます)。
BindingExpression be = itemNameTextBox.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();
各プロパティのセットで変更の通知を発生させる代わりに (それが再バインディングと更新をトリガーするため)、すべての発生通知を保存ボタンに入れます。次に、[保存] をクリックして保存し、それらの (現在設定されている) プロパティに再バインドするようにビューに指示します。
これをさらに進めるには:非シングルトンプロパティにバインドします(保存がクリックされるまで古い設定を保持したいため)-それらのプロパティの通知を発生させません。
保存ボタンで、シングルトン プロパティを設定してから、他のプロパティのすべての通知を発生させます。
キャンセル ボタンで、他のプロパティをシングルトン プロパティの値に設定し、すべての通知を発生させます。
ビューが初めてロードされたときにプロパティをシングルトン プロパティに設定し、すべての通知を (キャンセルのように) 発生させることを忘れないでください。
WPF を使用している場合は、UpdateSourceTrigger を LostFocus に変更します。目的は解決すると思います。
Text="{Binding Path=MyText, UpdateSourceTrigger=LostFocus, Mode=TwoWay}"