Предположим, у вас есть текстовое поле, привязанное к свойству элемента данных, и кнопка.
Если вы вводите текст в текстовое поле, а затем нажимаете кнопку мыши, в следующем порядке происходят следующие события:
- Текст записывается из элемента управления в связанный элемент
- Запущено событие нажатия кнопки
Однако, если вы активируете кнопку с помощью мнемонической клавиши, текстовое поле не теряет фокус. Кажется, что текст записывается из элемента управления в связанный элемент только тогда, когда текстовое поле теряет фокус.
Есть ли известный обходной путь к этому? Мне нужно такое же поведение, независимо от того, щелкнете ли вы левой кнопкой мыши по кнопке, перейдете к кнопке и нажмете пробел или используете мнемонику.
Я приведу полный пример. Если вы введете слово «Hello» и нажмете кнопку, вы получите окно сообщения «WidgetName = Hello». Но если вы затем изменили его на «Goodbye» и нажали ALT-A, он все равно будет «WidgetName = Hello».
Вот код XAML
<Window x:Class="BindingOrder.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BindingOrder"
Title="Window1" Height="79" Width="282">
<Window.Resources>
<local:Widget x:Key="Widget" />
</Window.Resources>
<StackPanel Orientation="Horizontal" Height="30" VerticalAlignment="Top">
<TextBox
Width="200"
Margin="3, 3, 3, 3"
Text="{Binding Source={StaticResource Widget}, Path=WidgetName}" />
<Button
Click="OnApplyClicked"
Margin="3, 3, 3, 3">
_Apply
</Button>
</StackPanel>
</Window>
и вспомогательный код:
using System;
using System.Windows;
namespace BindingOrder
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void OnApplyClicked(object sender, RoutedEventArgs e)
{
Widget w = (Widget)this.Resources["Widget"];
MessageBox.Show(string.Format("WidgetName={0}", w.WidgetName));
}
}
public class Widget
{
public string WidgetName { get; set; }
}
}