2009-09-17 14 views
9

todos. Tengo un usercontrol "NumericTextBox" que solo permite entradas numéricas. Necesito mostrar otro comportamiento especializado, es decir, lo necesito para poder vincularlo a un valor VM OneWayToSource y solo tengo la actualización del valor VM cuando presiono enter mientras enfoco el cuadro de texto. Ya tengo el evento EnterPressed que se activa cuando presiono la tecla, me cuesta mucho encontrar la manera de hacer que esa acción actualice el enlace ...Cuadro de texto WPF que solo actualiza el enlace cuando se presiona enter

Respuesta

11

En su expresión de enlace, configure UpdateSourceTrigger a explícito.

Text="{Binding ..., UpdateSourceTrigger=Explicit}" 

Entonces, cuando se manipula el caso EnterPressed, llaman UpdateSource en la expresión de enlace, esto empujará el valor del cuadro de texto a la propiedad cota real.

BindingExpression exp = textBox.GetBindingExpression(TextBox.TextProperty); 
exp.UpdateSource(); 
3

Si está usando MVVM se puede utilizar una combinación de enfoque de decastelijau junto con una propiedad asociada a medida que llama UpdateSource en el cuadro de texto cuando PreviewKeyUp.

public static readonly DependencyProperty UpdateSourceOnKey = DependencyProperty.RegisterAttached(
    "UpdateSourceOnKey", 
    typeof(Key), 
    typeof(TextBox), 
    new FrameworkPropertyMetadata(false) 
); 
public static void SetUpdateSourceOnKey(UIElement element, Key value) 
{ 

    //TODO: wire up specified key down event handler here 
    element.SetValue(UpdateSourceOnKey, value); 

} 
public static Boolean GetUpdateSourceOnKey(UIElement element) 
{ 
    return (Key)element.GetValue(UpdateSourceOnKey); 
} 

entonces usted puede hacer:

<TextBox myprops:UpdaterProps.UpdateSourceOnKey="Enter" ... /> 
7

Aquí es una versión completa de la idea proporcionada por Anderson Imes:

public static readonly DependencyProperty UpdateSourceOnKeyProperty = 
    DependencyProperty.RegisterAttached("UpdateSourceOnKey", 
    typeof(Key), typeof(TextBox), new FrameworkPropertyMetadata(Key.None)); 

    public static void SetUpdateSourceOnKey(UIElement element, Key value) { 
     element.PreviewKeyUp += TextBoxKeyUp; 
     element.SetValue(UpdateSourceOnKeyProperty, value); 
    } 

    static void TextBoxKeyUp(object sender, KeyEventArgs e) { 

     var textBox = sender as TextBox; 
     if (textBox == null) return; 

     var propertyValue = (Key)textBox.GetValue(UpdateSourceOnKeyProperty); 
     if (e.Key != propertyValue) return; 

     var bindingExpression = textBox.GetBindingExpression(TextBox.TextProperty); 
     if (bindingExpression != null) bindingExpression.UpdateSource(); 
    } 

    public static Key GetUpdateSourceOnKey(UIElement element) { 
     return (Key)element.GetValue(UpdateSourceOnKeyProperty); 
    } 
Cuestiones relacionadas