Enter Key Up上的WPF验证

时间:2010-04-19 23:55:21

标签: wpf data-binding

我正在尝试在按下Enter键时验证UI更改。 UI元素是一个文本框,它是绑定到字符串的数据。我的问题是当Enter键为Up时数据绑定没有更新TestText。只有当我按下按钮弹出一个消息框时才会更新。

/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window, INotifyPropertyChanged
{
    String _testText = new StringBuilder("One").ToString();
    public string TestText
    {
        get { return _testText; }
        set { if (value != _testText) { _testText = value; OnPropertyChanged("TestText"); } }
    }


    public Window1()
    {
        InitializeComponent();
        myGrid.DataContext = this;
    }

    private void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void onKeyUp(object sender, KeyEventArgs e)
    {
       if (e.Key != System.Windows.Input.Key.Enter) return;
       System.Diagnostics.Trace.WriteLine(TestText);
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(TestText);
    }

}

Window XAML:

Window x:Class="VerificationTest.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" KeyUp="onKeyUp"

TextBox XAML:

TextBox Name="myTextBox" Text="{Binding TestText}"

按钮XAML:

Button Name="button1" Click="button1_Click"

1 个答案:

答案 0 :(得分:11)

为了强制TextBox将值提交回绑定源,您可以执行以下操作:

var binding = myTextBox.GetBindingExpression(TextBox.TextProperty);
binding.UpdateSource();

或者,您可以配置绑定,以便每次Text属性更改时更新源,这对您在文本框中输入的每个字符都有意义。

<TextBox Name="myTextBox"
         Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}" />

但这会引发很多房产变更通知。我在我的应用程序中所做的是创建一个派生自TextBox的类来覆盖OnKeyDown方法,当按下enter时,我调用UpdateSource方法,如上所述,并调用{{1}在TextBox上给用户一个我只是“接受”他们输入的想法。从TextBox派生类将允许您在应用程序中的任何其他地方重用该行为。