Проверка WPF при вводе ключа вверх - PullRequest
6 голосов
/ 20 апреля 2010

Я пытаюсь подтвердить изменение пользовательского интерфейса при нажатии клавиши Enter. Элемент пользовательского интерфейса представляет собой текстовое поле, которое представляет собой данные, связанные со строкой. Моя проблема заключается в том, что привязка данных не обновила TestText, когда клавиша Enter имеет значение Up. Он обновляется только при нажатии кнопки, которая вызывает окно сообщения.

/// <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);
    }

}

Окно 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 Ответ

12 голосов
/ 20 апреля 2010

Чтобы заставить TextBox зафиксировать значение обратно в источник привязки, вы можете сделать:

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

При желании вы можете настроить привязку для обновления источника каждый раз, когда изменяется свойство Text, что будет означать каждый символ, вводимый в текстовое поле.

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

Но это вызовет много уведомлений об изменении свойств. В моих приложениях я создал класс, производный от TextBox, для переопределения метода OnKeyDown, и когда нажата кнопка ввода, я вызываю метод UpdateSource, как я описал выше, а также вызываю SelectAll в TextBox, чтобы получить У пользователя возникла мысль, что я просто «принял» их вклад. Извлечение класса из TextBox позволит вам повторно использовать это поведение в любом другом месте, которое вам может понадобиться в вашем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...