14

データベース情報を編集するためのWPFウィンドウがあります。これは、EntityFrameworkオブジェクトを使用して表されます。ユーザーがウィンドウを閉じると、情報が変更されたかどうかをClosingイベントで通知し、変更をデータベースに保存するように提案するメッセージボックスを表示したいと思います。

残念ながら、現在フォーカスされている編集への変更は、編集がフォーカスを失うまでバインディングソースに割り当てられません。これは、Closingイベントが処理された後のある時点で発生します。

理想的には、エンティティが変更されているかどうかを確認する前に呼び出すことができる、ビュー階層内のすべての変更をコミットするルーチンがあります。また、フォーカスを使用してコントロールのフォーカスをプログラムでクリアする方法についての情報も探しましたが、その方法がわかりません。

私の質問は、これは通常どのように処理されるのですか?

4

6 に答える 6

24

BindingWPFでは、フォーカスを失うのではなく、変更時にソースを更新するようにa を変更できます。これを行うには、UpdateSourceTriggerプロパティをPropertyChanged次のように設定します。

Value="{Binding Path=MyProperty, UpdateSourceTrigger=PropertyChanged}"
于 2011-01-18T13:51:07.040 に答える
8

これはあなたをかなり近づけるはずです:



private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    ForceDataValidation();
}


private static void ForceDataValidation()
{
    TextBox textBox = Keyboard.FocusedElement as TextBox;

    if (textBox != null)
    {
        BindingExpression be = textBox.GetBindingExpression(TextBox.TextProperty);
        if (be != null && !textBox.IsReadOnly && textBox.IsEnabled)
        {
            be.UpdateSource();
        }
    }

}


于 2008-10-22T02:32:23.973 に答える
6

おそらく、現在の要素からフォーカスを削除する必要があります

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    FocusManager.SetFocusedElement(this, null);
}
于 2014-10-14T10:47:18.850 に答える
1

タブシーケンスに複数のコントロールがあると仮定すると、次の解決策は完全で一般的なように見えます(カットアンドペーストのみ)...

Control currentControl = System.Windows.Input.Keyboard.FocusedElement as Control;

if (currentControl != null)
{
    // Force focus away from the current control to update its binding source.
    currentControl.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
    currentControl.Focus();
}
于 2011-01-18T13:39:39.523 に答える
0

この投稿の提案も見てください

于 2008-10-22T06:01:36.813 に答える
0

最も簡単な方法は、フォーカスをどこかに設定することです。フォーカスをすぐに戻すことができますが、フォーカスを任意の場所に設定すると、任意のタイプのコントロールで LostFocus-Event がトリガーされ、その内容が更新されます。

IInputElement x = System.Windows.Input.Keyboard.FocusedElement;
DummyField.Focus();
x.Focus();

もう 1 つの方法は、フォーカスされた要素を取得し、フォーカスされた要素からバインド要素を取得し、更新を手動でトリガーすることです。TextBox と ComboBox の例 (サポートする必要があるコントロール タイプを追加する必要があります):

TextBox t = Keyboard.FocusedElement as TextBox;
if ((t != null) && (t.GetBindingExpression(TextBox.TextProperty) != null))
  t.GetBindingExpression(TextBox.TextProperty).UpdateSource();
ComboBox c = Keyboard.FocusedElement as ComboBox;
if ((c != null) && (c.GetBindingExpression(ComboBox.TextProperty) != null))
  c.GetBindingExpression(ComboBox.TextProperty).UpdateSource();
于 2008-10-23T14:14:09.143 に答える