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