Salut à toutes et à tous,

Soit un TextBox bindé à une variable.
Soit le même TextBox sur lequel je veux utiliser d'event TextChanged.

Le Xaml du TextBox
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        ...
        <TextBox Grid.Row="11" Grid.Column="1" Margin="5,5,0,5" Width="70" HorizontalAlignment="Left" Text="{Binding Decalage}" PreviewTextInput="TextBox_PreviewTextInput" x:Name="DecalageTBox">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="TextChanged">
                    <i:InvokeCommandAction Command="{Binding DecalageChangedCommand}" CommandParameter="{Binding Text, ElementName=DecalageTBox}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </TextBox>
La variable dans le ViewModel
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
        private int _decalage;
        public int Decalage
        {
            get
            {
                return _decalage;
            }
            set
            {
                if (_decalage == value)
                    return;
                _decalage = value;
                RaisePropertyChanged(() => Decalage);
            }
        }
Le code de l'Event
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
public RelayCommand<string> DecalageChangedCommand { get; private set; }
          ...  
          DecalageChangedCommand = new RelayCommand<string>(
                text =>
                {
                    if (string.IsNullOrWhiteSpace(text))
                        Decalage = 0;
                    else
                        Decalage = Convert.ToInt32(text);
                });
Le problème :
Au chargement le TextBox se bind bien (puisque "0", la valeur de départ, apparaît).
Lorsque je modifie le Text du Texbox, l'EventTrigger passe très bien et Decalage est bien mis à jour.
Par contre, si je modifie Decalage par le code, La variable est bien mise à jour, mais immédiatement après l'EventTrigger repasse et le text est toujours à la valeur écrite dans le TextBox. Le Decalage revient donc à la valeur précédente.

Je ne comprend pas. Si l'EventTrigger relance DecalageChangedCommand , c'est bien que le text de la TextBox a changé. J'en déduis donc que le TextBox est mis à la valeur modifié par le code dans Décalage. Pourquoi l'EventTrigger déclanche DecalageChangedCommand alors que le text est le même ?
Il me semble que lorsque Decalage change, le TextBox qui lui est bindé se met à jour. Je comprend dès lors que l'EventTrigger déclenche DecalageChangedCommand, mais le text devrait être le même que Decalage.

Exemple :
Démarrage : Decalage = 0 => TextBox.Text = "0"
Utilisateur : modification de "0" par 20 : Decalage se met bien à 20.
Code : Decalage = 30 : Decalage se met bien à 30. Immédiatement après, DecalageChangedCommand se déclenche et son text = "20". Decalage revient donc à 20. (C'est ici mon problème. Si DecalageChangedCommand déclenche, c'est à mon avis que TextBox.Text a dû changer, donc passer à 30. Pourquoi le text est-t-il à 20 ?)


Qui peut m'expliquer ?
Merci de vos z'avis z'avisés