12

次の単純な WPF アプリケーションでTextBoxは、そのコントロールからフォーカスが失われたときにプロパティを更新するように a が設定されています。

<DockPanel>
    <ToolBar DockPanel.Dock="Top">
        <Button>Test</Button>
    </ToolBar>
    <TextBox Text="{Binding MyString}" />
</DockPanel>

public MainWindow()
{
    InitializeComponent();
    DataContext = this;
}

public string MyString
{
    get { return _myString; }
    set { _myString = value; }
}

ただし、このアプリケーションを実行すると、テキスト ボックスにテキストを入力して [テスト] ボタンをクリックすると、MyStringプロパティのブレークポイントが発生せず、イベントのイベント ハンドラーも発生しFocusLostません。これらのイベントは、他の手段 (ウィンドウが閉じられたなど) によってコントロールからフォーカスが失われた場合にのみ発生します。

MyString実際には、[テスト] ボタンには、更新されるプロパティに依存するロジックが含まれているため、これが問題を引き起こしています。

FocusLost「テスト」ボタンをクリックしたときにイベントが正しく発生し、バインディングが更新されることを確認するにはどうすればよいですか? ToolBarを標準のボタンに置​​き換えてもToolBarこの動作にはならないため、の使用が原因で問題が発生しているようです。

4

4 に答える 4

3

添付プロパティは、いくつかの仮定を行います。

  • LostKeyboardFocusLostFocusイベントの区別に依存するものは何もない
  • アタッチされている要素のバインディングが実際にLostFocusイベントに応答すること ( UpdateSourceTrigger.Explicitを持つことができます)

代わりに、要素のバインディングを列挙し、UpdateSourceを直接呼び出すことができます。

private void CommitBindings(DependencyObject element) {
    var localValueEnumerator = element.GetLocalValueEnumerator();
    while (localValueEnumerator.MoveNext()) {
        var entry = localValueEnumerator.Current;
        if (BindingOperations.IsDataBound(element, entry.Property)) {
            var bindingExpression = (BindingExpressionBase)entry.Value;
            bindingExpression.UpdateSource();
        }
    }
}

また、それぞれをTextBox個別に処理する代わりに、コンテナーを処理し、OldFocusを使用して、キーボード フォーカスを失った実際の要素を取得することもできます。

于 2013-06-04T12:35:14.820 に答える