IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Arrêt binding après modification de la DependencyProperty dans le code


Sujet :

Windows Presentation Foundation

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Points : 15
    Points
    15
    Par défaut Arrêt binding après modification de la DependencyProperty dans le code
    Bonjour,

    Je suis en train de créer un UserControl (NumericBox) pour autoriser uniquement la saisie d'un nombre entier, double ou hexadécimal.
    Mon UserControl contient uniquement un TextBox sur lequel je vérifie les caractères saisis pour empêcher l'affichage de quelque chose d'autre qu'un nombre.
    Le résultat est stocké dans une DependencyProperty "Value".

    Je peux à travers le binding, soit afficher une valeur d'un autre Control dans celui-ci (premier binding dans exemple ci-dessous), soit utiliser sa valeur dans un autre Control (second binding dans l'exemple):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <StackPanel>
    	<Slider Name="slider" Minimum="0" Maximum="100"/>
            <local:NumericBox x:Name="numericBox" Value="{Binding ElementName=slider, Path=Value, Mode=OneWay}" />
            <Slider Minimum="0" Maximum="100" Value="{Binding ElementName=numericBox, Path=Value, Mode=OneWay}"/>
    </StackPanel>
    En faisant glisser le premier slider, la valeur de mon UserControl est bien mise-à-jour, ce qui entraîne la mise-à-jour du second slider.
    Si ensuite j'entre une nouvelle valeur dans mon UserControl, le second slider est correctement modifié et le premier ne bouge pas (binding OneWay).

    Par contre, le problème est qu'à partir de ce moment-là le premier binding ne fonctionne plus (en faisant glisser le premier slider mon UserControl n'est plus mis-à-jour).

    En fait, le binding s'arrête dès que je modifie la propriété Value dans le code de mon UserControl, et bizarrement, le problème disparaît en faisant du binding TwoWay.

    Ci-dessous le code simplifié de mon UserControl (le xaml ne contient qu'un TextBox)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    public partial class NumericBox : UserControl
        {
            public int Value
            {
                get { return (int)GetValue(ValueProperty); }
                set { SetValue(ValueProperty, value); }
            }
     
            // Using a DependencyProperty as the backing store for Value.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty ValueProperty =
                DependencyProperty.Register("Value", typeof(int), typeof(NumericBox), new UIPropertyMetadata(0, OnValueChanged));
     
            private bool updateValue = true;
            private bool updateTextBox = true;
     
            public NumericBox()
            {
                InitializeComponent();
            }
     
            // Mettre à jour l'affichage lorsque Value est modifié par un autre élément
            public static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                NumericBox numericBox = d as NumericBox;
     
                if (numericBox.updateTextBox)
                {
                    numericBox.updateValue = false;
                    numericBox.textBox.Text = ((int)e.NewValue).ToString();
                    numericBox.updateValue = true;
                }
            }
     
            // Mettre à jour Value lorsque l'utilisateur entre un nouveau nombre
            private void textBox_TextChanged(object sender, TextChangedEventArgs e)
            {
                if (updateValue)
                {
                    updateTextBox = false;
                    Value = Convert.ToInt32(textBox.Text);  // <- le premier binding s'arrête ici
                    updateTextBox = true;
                }
            }
    Savez-vous comment faire pour que le binding continu de fonctionner après cette modification de la propriété dans le code ?

    Merci d'avance

  2. #2
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Points : 15
    Points
    15
    Par défaut
    Bonjour,

    Finalement il faut utiliser SetCurrentValue au lieu de SetValue pour modifier la valeur d'une propriété de dépendance sans affecter le binding.

    http://msdn.microsoft.com/fr-fr/libr...etcurrentvalue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public partial class NumericBox : UserControl
    {
        public int Value
        {
            get { return (int)GetValue(ValueProperty); }
            set { SetValue(ValueProperty, value); }
        }
     
        // Using a DependencyProperty as the backing store for Value.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value", typeof(int), typeof(NumericBox), new UIPropertyMetadata(0, OnValueChanged));
     
        public NumericBox()
        {
            InitializeComponent();
        }
     
        // Mettre à jour l'affichage lorsque Value est modifié par un autre élément
        public static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            NumericBox numericBox = d as NumericBox;
            numericBox.textBox.Text = ((int)e.NewValue).ToString();
        }
     
        // Mettre à jour Value lorsque l'utilisateur entre un nouveau nombre
        private void textBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            // Value = Convert.ToInt32(textBox.Text);  // <- met à jour la valeur mais supprime le binding
            SetCurrentValue(ValueProperty, Convert.ToInt32(textBox.Text)); // <- met à jour la valeur tout en gardant le binding
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Insertion dans une table après modification d'un champ
    Par tunis71187 dans le forum Forms
    Réponses: 7
    Dernier message: 13/03/2013, 20h36
  2. séquence de démarrage après modif dans msconfig
    Par awalter1 dans le forum Windows XP
    Réponses: 6
    Dernier message: 07/04/2012, 09h57
  3. Réponses: 5
    Dernier message: 20/09/2011, 18h55
  4. Expander qui se ferme après modif de l'expression bindé
    Par dachman dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 29/06/2009, 12h57
  5. .mdb perdu après modif du nom dans Save As
    Par electrosat03 dans le forum VBA Access
    Réponses: 2
    Dernier message: 22/06/2008, 12h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo