2009-09-17 8 views
9

tous. J'ai un usercontrol "NumericTextBox" qui autorise seulement les entrées numériques. J'ai besoin d'afficher un autre comportement spécialisé, c'est-à-dire que j'en ai besoin pour pouvoir le lier à une valeur VM OneWayToSource et avoir seulement la valeur VM mise à jour quand j'appuie sur enter tout en focalisant la zone de texte. J'ai déjà un événement EnterPressed qui se déclenche quand j'appuie sur la touche, j'ai juste du mal à trouver un moyen de provoquer cette action pour mettre à jour la liaison ...Zone de texte WPF qui met uniquement à jour la liaison lorsque vous appuyez sur Entrée

Répondre

11

Dans votre expression de liaison, définissez le UpdateSourceTrigger Expliquer

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

Ensuite, lors de la manipulation de l'événement EnterPressed, appelez UpdateSource sur l'expression de liaison, cela poussera la valeur de la zone de texte à la propriété liée réelle.

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

Si vous utilisez MVVM vous pouvez utiliser une combinaison de l'approche de decastelijau avec une propriété attachée personnalisée qui appelle UpdateSource sur la zone de texte lorsque 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); 
} 

Ensuite, vous pouvez faire:

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

Voici une version complète de l'idée fournie par 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); 
    } 
Questions connexes