2010-04-19 19 views
5

Estoy intentando validar un cambio de UI cuando se presiona la tecla Entrar. El elemento UI es un cuadro de texto, que es información enlazada a una cadena. Mi problema es que el enlace de datos no ha actualizado TestText cuando la tecla Intro está Arriba. Solo se actualiza cuando presiono el botón que muestra un cuadro de mensaje.Validación de WPF al introducir la tecla

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

} 

Ventana 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" 

cuadro de texto XAML:

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

botón XAML:

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

Hay un hilo relacionado en http://stackoverflow.com/questions/563195/wpf-textbox-databind-on-enterkey-press –

Respuesta

9

Con el fin de forzar el cuadro de texto para cometer el valor de nuevo a la fuente de enlace que puede hacer:

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

Opcionalmente, se puede configurar el enlace para actualizar el origen cada vez que cambia la propiedad de texto, lo que significaría en cada carácter que introduce en el cuadro de texto.

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

Pero esto elevará una gran cantidad de notificaciones de cambio de propiedad. Lo que he hecho en mis aplicaciones era crear una clase derivada de TextBox para anular el método OnKeyDown y cuando se presiona enter, llamo al método UpdateSource como describí anteriormente y también llamo al SelectAll en el TextBox para darle al usuario una idea de que solo "aceptó" su entrada. Derivar una clase de TextBox te permitirá reutilizar ese comportamiento en cualquier otro lugar que desees en tu aplicación.

+0

... Gracias funciona para mi caso simple demostración. ¿Algún consejo sobre cómo forzar la actualización si tengo muchos elementos de UI como este? – Warpin

+0

Consulte mis ediciones. Acabo de agregar una sugerencia para crear una clase derivada de TextBox. Hay alrededor de una docena de maneras de hacerlo en WPF usando comportamientos, propiedades de dependencia adjuntas, comandos, etc. pero creo que hacerlo en una clase derivada de la manera que sugerí sería el enfoque más fácil. – Josh

Cuestiones relacionadas