WPF:如果您使用助记符激活按钮,则不会发生文本框数据绑定(bind)

标签 wpf data-binding xaml

假设您有一个绑定(bind)到数据项属性的文本框和一个按钮。 如果您在文本框中输入文本,然后用鼠标单击按钮,则会按顺序发生以下事件:

  • 文本从控件写入绑定(bind)项
  • 触发按钮点击事件

但是,如果您使用助记键激活该按钮,文本框不会失去焦点。似乎只有当文本框失去焦点时,文本才会从控件写入绑定(bind)项。

是否有已知的解决方法?无论您左键单击按钮、按 Tab 键并按空格键还是使用助记符,我都希望获得相同的行为。

我将提供一个完整的示例。如果您输入单词“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; }
    }
}

最佳答案

我发现的最简单的解决方案(除了使用 UpdateSourceTrigger 属性,如 Joseph 建议的那样)是将焦点转移到 Click 事件中的按钮。无论按钮如何“单击”(通过键盘或鼠标),都会触发按钮的 Click 事件。

如果您希望 TextBox 保持焦点,您可以将当前获得焦点的控件保留在变量中,然后将焦点转移到按钮并立即返回到该控件。但这并不理想,因为文本框中的插入符号位置将会改变。

关于WPF:如果您使用助记符激活按钮,则不会发生文本框数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1441558/

相关文章:

c# - 为什么将字符串路径转换为 ​​Geometry 并再次返回会抛出 FormatException?

javascript - RegisterJsObject CefSharp 不起作用

asp.net - <%#..%> 和 <%# :. .%> 之间的区别? (冒号符号)

c# - 如何在 TreeView 中包装 TextBlock 内容?

c# - 从附加属性设置样式中的 WPF MenuItem 图标

c# - 垂直分组 - WPF DataGrid 或 ListView

c# - WPF:制作标准菜单的正确方法

c# - "Could not load file or assembly"在C#中使用Wpf自定义控件时出现异常

c# - 如何使用MVVM在ListBox中显示字符串?

asp.net-mvc - DataAnnotationsModelBinder 如何与自定义 ViewModel 配合使用?