WPF use override Propriété dans une classe héritée en XAML

J’ai un petit problème et je ne trouve aucune solution. Peut-être que c’est un problème dans Visual Studio.

J’ai créé une nouvelle classe héritée de Image. Je remplace ensuite la propriété Source.

class GifImage : Image { public new ImageSource Source { get { return base.Source; } set { MesssageBox("new source property"); base.Source = value; } } } 

Si je mets la source dans le code

 GifImage gifImage = new GifImage(); gifImage.Source = gifimage2; 

Ensuite, la source sera correctement définie sur GifImage et le MessageBox sera affiché.

Mais si je mets Source dans le code Xaml:

  

Ensuite, la propriété Source de l’image sera définie et le MessageBox ne sera pas affiché.

Mon idée était de définir l’atsortingbut System.ComponentModel.Browsable, en pensant que la propriété de la classe GifImage héritée n’est peut-être pas visible dans Visual Studio et qu’il utilise la propriété source de la classe parente.

 [Browsable(true)] public new ImageSource Source 

Mais cela ne fonctionne toujours pas.

Quelqu’un a-t-il eu le même problème ou / et la solution?

Vous ne pouvez pas remplacer un DependencyProperty de cette manière dans WPF.

Comme la propriété Source sur une image est un DependencyProperty, lorsque la valeur est affectée en XAML (et à d’autres emplacements), sa valeur est définie à l’aide de

 DependencyObject.SetValue(SourceProperty, value) 

Une solution possible consiste à remplacer les métadonnées de DependencyProperty et à append un écouteur de modification, par exemple:

  static GifImage() { SourceProperty.OverrideMetadata(typeof(GifImage), new FrameworkPropertyMetadata(new PropertyChangedCallback(SourcePropertyChanged))); } private static void SourcePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) { MessageBox("new source property"); } 

ou alternativement en utilisant le DependencyPropertyDescriptor

 DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(Image.SourceProperty, typeof(Image)); if (dpd != null) { dpd.AddValueChanged(tb, delegate { MessageBox("new source property"); }); }