9
votes

Comment forcer un événement textuel sur une zone de texte WPF et maintenir la mise au point?

Je crée une zone de texte numérique dans WPF , avec deux boutons pour augmenter et diminuer la valeur.

J'ai créé deux routécommand pour gérer le Behiavor et ils fonctionnent bien. Il n'y a qu'un seul problème que je voudrais résoudre. Je voudrais que le contrôle avigne tous les objets liés à son textProperty lorsqu'une commande d'augmentation ou de diminution est exécutée.

Pour le moment, il envoie la notification uniquement lorsque je change de concentration sur un autre contrôle

Toute aide est vraiment appréciée, Merci


0 commentaires

3 Réponses :


13
votes

Utiliser updatedatesTourcetrigger = "explicite" code> dans la liaison et dans textchanged up thumb up thumb down the liaison de liaison code>. Donc, vous écrivez quelque chose comme ceci: xxx pré>

aime plutôt que ceci p> xxx pré>

et dans textchanged code> gestionnaire d'événements Mettez à jour la liaison. P>

control.GetBindingExpression(NumericTextBox.TextProperty).UpdateSource();


2 commentaires

@Viky merci beaucoup! J'ai oublié que cela a été possible, utilisez l'expression "Control.getBindingExpression (numéritextbox.textProperty) .u pdatesource ();" C'est parfait. Je l'appelle uniquement lorsque l'utilisateur appuie sur les boutons d'augmentation et de diminution et utilisez le comportement normal lors de la modification du texte manuellement.


Pourquoi ne pas simplement utiliser text = "{contraignant YourbindableProperty, mises à jour SontRigger = PropertyChanged}" ?



2
votes

Le comportement par défaut de la liaison de la propriété de texte sur un Textbox code> est de mettre à jour sur lutfocus code>. Vous pouvez modifier cela dans votre contrôle personnalisé en remplaçant les métadonnées sur le textProperty code> dans votre CTOR statique:

static NumericTextBox()
{
    TextProperty.OverrideMetadata(
        typeof(NumericTextBox),
        new FrameworkPropertyMetadata("", // default value
            FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
            null,  // property change callback
            null,  // coercion callback
            true,  // prohibits animation
            UpdateSourceTrigger.PropertyChanged));
}


1 commentaires

@Be Merci Abe, très utile mais Viky réponse est plus flexible pour mon cas



32
votes

Il y a un moyen simple: xxx

(je l'ai testé sur la zone de texte). Bonne chance


1 commentaires

+1. Text = "{Binding MyTextProperty, UpdatesTourceRigger = PropertyChanged}" semble être le meilleur moyen d'aller.