Пожалуйста, рассмотрите следующий пример. Обратите внимание, что в реальном слове источником привязки, скорее всего, будет объект данных. Я использую 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.