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
La variable dans le ViewModel
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>
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
11
12
13
14
15 private int _decalage; public int Decalage { get { return _decalage; } set { if (_decalage == value) return; _decalage = value; RaisePropertyChanged(() => Decalage); } }
Le problème :
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); });
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
Partager