2010-04-19 11 views
5

Sto provando a convalidare una modifica dell'interfaccia utente quando si preme il tasto Invio. L'elemento dell'interfaccia utente è una casella di testo, ovvero i dati sono vincolati a una stringa. Il mio problema è che l'associazione dati non ha aggiornato TestText quando il tasto Invio è attivo. Viene aggiornato solo quando premo il pulsante che visualizza una finestra di messaggio.Convalida WPF su Inserisci chiave su

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

} 

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

Button XAML:

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

C'è un filo correlato al http://stackoverflow.com/questions/563195/wpf-textbox-databind-on-enterkey-press –

risposta

9

Al fine di costringere il TextBox a commettere il valore indietro al fonte vincolante che puoi fare:

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

Opzionalmente, è possibile configurare l'associazione per aggiornare l'origine ogni volta che il testo modifiche alle proprietà che significherebbe su ogni carattere immesso nella casella di testo.

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

Ma questo solleverà molte notifiche di modifica delle proprietà. Quello che ho fatto nelle mie applicazioni era di creare una classe derivata da TextBox per sovrascrivere il metodo OnKeyDown e quando si preme invio, chiamo il metodo UpdateSource come descritto sopra e chiamo anche SelectAll sul TextBox per dare all'utente un'idea che io solo "accettato" il loro input. La derivazione di una classe da TextBox ti consentirà di riutilizzare quel comportamento in qualsiasi altra parte della tua applicazione.

+0

Grazie ... funziona per il mio caso semplice demo. Qualche suggerimento su come forzare l'aggiornamento se ho molti elementi dell'interfaccia utente come questo? – Warpin

+0

Fare riferimento alle mie modifiche. Ho appena aggiunto un suggerimento per creare una classe derivata da TextBox. Ci sono circa una dozzina di modi in cui puoi farlo in WPF usando comportamenti, proprietà di dipendenze collegate, comandi, ecc. Ma penso che farlo in una classe derivata come ho suggerito sarebbe l'approccio più semplice. – Josh