При использовании клавиш доступа привязка LostFocus не работает - PullRequest
0 голосов
/ 17 ноября 2008

Пожалуйста, рассмотрите следующий пример. Обратите внимание, что в реальном слове источником привязки, скорее всего, будет объект данных. Я использую TextBlock для простоты.

<Window x:Class="Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel Margin="20">

        <Label>Enter a Name:</Label>
        <TextBox x:Name="txt_Name" Text="{Binding ElementName=display_name, Path=Text, UpdateSourceTrigger=LostFocus}" />

        <Label>The name you entered:</Label>
        <TextBlock x:Name="display_name" />

        <Button x:Name="btn_Save" Click="SaveClick">_Save</Button>

    </StackPanel>
</Window>
Class Window1

    Private Sub SaveClick(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
        MessageBox.Show("Saving your name as: " & display_name.Text)
    End Sub

End Class

В приведенном выше примере, если я ввожу имя "Joe" в TextBox и нажимаю кнопку «Сохранить», TextBlock обновляется после LostFocus и данные «сохраняются» должным образом. Все хорошо.

Однако, если я затем ввожу "Bob" в TextBox и использую мой ключ доступа (Alt-S) для сохранения, TextBlock не обновляется, поскольку событие LostFocus в TextBox не уволена. В результате мой источник привязки не обновляется, и сохраняется неправильное значение (т. Е. "Joe").

В большинстве полей ввода данных WPF TextBox вам потребуется выполнить проверку по LostFocus (не PropertyChanged); однако, если событие LostFocus не срабатывает (и, следовательно, привязка не обновляется) при использовании ключа доступа, как мы проверяем запись? В WinForms у нас есть события Validating и Validated, но они отсутствуют в WPF.

Ответы [ 3 ]

2 голосов
/ 17 ноября 2008

Вы можете сделать это вручную перед сохранением, используя:

txt_Name.GetBindingExpression(TextBox.TextProperty).UpdateTarget();

Немного некрасиво, но это работает.

1 голос
/ 23 апреля 2010

Что ж, если вас больше интересует сценарий реального мира, чем ваш надуманный пример, вы можете установить привязку к текстовому полю, чтобы обновлять данные, а не терять фокус, и данные будут сохраняться в обоих сценариях без всяких безобразных хаков. Единственная проблема (которая упоминается в документации WPF для Bindings) заключается в том, что это может повлиять на производительность вашего приложения. Если вы работаете на какой-либо даже относительно новой машине, вы не заметите разницу (у меня нет).

1 голос
/ 18 ноября 2008

Вы также можете изменить фокус в вашем обработчике кликов перед чтением значения, например, перенести фокус на кнопку или другое текстовое поле

Это еще одно «уродливое, но работающее» решение, оно может подойти, если у вас много элементов управления или вы не хотите связываться с их выражениями связывания.

...