WPF - Problème de Binding
Bonjour,
Je débute en WPF et j'ai encore quelques difficultés à bien assimiler le mécanisme de Binding. J'ai créé un code xaml avec un canvas, dans lequel il y a une image positionnée à l'aide de ses propriétés Canvas.Left et Canvas.Bottom.
Ces 2 propriétés sont bindés avec ma ViewModel (qui est définie comme étant le DataContext dans mon code behind), de la manière suivante :
Code:
1 2 3
|
Canvas.Left="{Binding Coordonnees_X, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Canvas.Bottom="{Binding Coordonnees_Y, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" |
Dans ma ViewModel, je retrouve logiquement Coordonnees_X et Coordonnees_Y, de la manière suivante:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
private double coordonnees_X;
public double Coordonnees_X
{
get { return coordonnees_X; }
set { coordonnees_X = value; OnPropertyChanged("Coordonnees_X"); }
}
private double coordonnees_Y;
public double Coordonnees_Y
{
get { return coordonnees_Y; }
set { coordonnees_Y = value; OnPropertyChanged("Coordonnees_Y"); }
} |
Et, toujours dans le ViewModel, j'ai défini l'événement OnPropertyChanged :
Code:
1 2 3 4 5 6 7
|
public event PropertyChangedEventHandler PropertyChanged; // J'utilise un évènement de ce type pour propager l'info.
private void OnPropertyChanged(string nomPropriete) // Je veux propager au graphique le fait que les coordonnées ont changé
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(nomPropriete));
} |
Sur le fond, tout fonctionne.
Je souhaite maintenant appliquer une Animation à mon image pour la faire évoluer, en lien avec l'appui sur les flèches du clavier. Si l'on prend l'exemple de l'appui sur la flèche droite, mon code behind se présente de la façon suivante :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
private void Fenetre_KeyDown(object sender, KeyEventArgs e)
{
DoubleAnimation Anim;
if(e.Key == Key.Right)
{
Storyboard sb = new Storyboard();
Anim = new DoubleAnimation(PointDeDepart, PointDArrivee, TimeSpan.FromMilliseconds(Duree));
Storyboard.SetTargetName(Anim, "Nom_De_Mon_Image");
Storyboard.SetTargetProperty(Anim, new PropertyPath("(Canvas.Left)"));
sb.Children.Add(Anim);
sb.Begin(this);
} |
PointDeDepart, PointDArrivee et Duree ont été correctement définis et l'animation fonctionne.
Par contre, au fur et à mesure que mon image bouge sur la droite, la propriété Coordonnees_X n'est pas mise à jour, alors que mon animation porte bien sur propriété Canvas.Left de mon image, qui est elle-même bindée en mode "TwoWay" avec Coordonnees_X. Je me serais donc attendu à ce que Coordonnees_X soit mis à jour en même temps que mon image bouge via l'animation.
Pourquoi est-ce que cela ne marche pas comme cela et comment faire pour que cela fonctionne ainsi ?
Merci de votre aide.