1

ユーザーがデータを変更できるメインウィンドウを備えたプログラムがあります。プログラムには、やることのリストが表示されるTo Doダイアログもあります。このダイアログには、独自のデータコンテキスト(データベースへの接続)がありますが、更新されたデータを表示する必要があります。

メインウィンドウのすべてのフィールドでUpdateSourceTriggerをPropertyChangedに設定しませんでした(メインウィンドウの機能のため、これはすべての場合に必要になるわけではありません)。

ただし、ユーザーがto-do-dialogをアクティブにして、データをデータベースに保存し、to-do-dialogで再度読み取ることができる場合に備えて、「アクティブ」フィールドで更新ソースを実行するためのメインウィンドウが必要です。

ウィンドウに「非アクティブ化」イベントがあった場合は、それを使用して、フォーカスを別の何かに設定するだけで済みます(現在フォーカスされているコントロールを強制的にソースを更新します)。ただし、非アクティブ化イベントは存在せず、事後に発生する非アクティブ化のみが存在します。また、非アクティブ化されたメインウィンドウでフォーカスを設定すると、to-doダイアログのアクティブ化が台無しになります。また、to-do-dialogsActivedイベントではこれを行うことができません。Activatingイベントは役に立ちましたが、それは存在しません。

to-do-dialogがアクティブになる前に(タブで移動するか、マウスでクリックして)メインウィンドウでupdatesourceを強制する方法はありますか?

4

2 に答える 2

1

この種の@AkselKの答えには当てはまりませんが、プロパティを使用してキーボードに焦点を合わせたコントロールを見つけ、そのa、、、またはに基づいKeyboard.FocusedElementて適切なバインディングを更新します。スワップ先のウィンドウがフォーカスされていることを教えてくれると期待していましたが、実際には、非アクティブ化ウィンドウ内にいたコントロールを使用できます。TextBoxSelectorToggleButtonKeyboard.FocusedElement

void MyWindow_Deactivated(object sender, EventArgs e)
{
    if(Keyboard.FocusedElement is TextBox)
    {
        (Keyboard.FocusedElement as TextBox).GetBindingExpression(TextBox.TextProperty).UpdateSource();
    }
    else if(Keyboard.FocusedElement is Selector)
    {
        (Keyboard.FocusedElement as Selector).GetBindingExpression(Selector.SelectedItemProperty).UpdateSource();
        //todo: should this also update SelectedValueProperty?
    }
    else if(Keyboard.FocusedElement is ToggleButton)
    {
        (Keyboard.FocusedElement as ToggleButton).GetBindingExpression(ToggleButton.IsCheckedProperty).UpdateSource();
    }
}

そのSelector部分がSelectedValueのバインディングも更新する必要があるかどうかはわかりません。

于 2013-11-08T21:08:07.827 に答える
0

バインディングを更新するためにFocusを別の要素に設定する必要はありません。代わりに、GetBindingExpressionメソッドを使用できます。

valueTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();

これは、非アクティブ化イベントで機能する可能性があります。

于 2012-02-10T10:27:16.540 に答える