2010-04-19 13 views
5

Próbuję sprawdzić poprawność zmiany interfejsu użytkownika po naciśnięciu klawisza Enter. Element UI to pole tekstowe, które jest danymi powiązanymi z ciągiem znaków. Mój problem polega na tym, że powiązanie danych nie zaktualizowało TestText, gdy klawisz Enter jest w górze. Jest aktualizowany tylko po naciśnięciu przycisku, który wyświetla okno komunikatu.Sprawdzanie poprawności WPF przy wprowadzaniu klawisza Enter

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

} 

Okno 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}" 

Przycisk XAML:

Button Name="button1" Click="button1_Click" 
+0

Jest powiązany wątek na http://stackoverflow.com/questions/563195/wpf-textbox-databind-on-enterkey-press –

Odpowiedz

9

W celu wymuszenia TextBox popełnić wartość z powrotem do wiążące źródło, które możesz zrobić:

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

Opcjonalnie można skonfigurować wiązanie aby zaktualizować source za każdym razem zmienia się właściwość Text co oznaczałoby, na każdym znaku, który wchodzi w polu tekstowym.

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

Ale spowoduje to wiele powiadomień o zmianie właściwości. W swoich aplikacjach zrobiłem to, aby utworzyć klasę wywodzącą się z TextBox, aby zastąpić metodę OnKeyDown, a po naciśnięciu Enter wywoływam metodę UpdateSource, jak opisano powyżej, a także wywołuję SelectAll w TextBox, aby dać użytkownikowi pomysł, że po prostu "zaakceptował" ich wkład. Wyprowadzenie klasy z TextBox pozwoli na ponowne wykorzystanie tego zachowania w dowolnym innym miejscu, w którym może być potrzebne w aplikacji.

+0

Dzięki ... to działa na moim prostym przypadku demo. Każda wskazówka, jak wymusić aktualizację, jeśli mam wiele takich elementów interfejsu użytkownika? – Warpin

+0

Zobacz moje zmiany. Właśnie dodałem sugestię, aby utworzyć klasę wywodzącą się z TextBox. Istnieje około tuzina sposobów, w jaki można to zrobić w WPF przy użyciu zachowań, dołączonych właściwości zależności, poleceń itp., Ale myślę, że robienie tego w klasie pochodnej, tak jak sugerowałem, byłoby najprostszym podejściem. – Josh

Powiązane problemy