Dependency properties that subsequently use the property?

I am trying to set up a dependency property that has an object called Sprite, sprite contains the string spriteSheet, so I want to pass Sprite, and then this data is used to display the image in my control.

This is my attempt as it stands

public Sprite Sprite { get { return (Quiz.Sprite)GetValue(SpriteProperty); } set { spriteBrush.ImageSource = new BitmapImage(new Uri("/Project;component/" + value.spriteSheet, UriKind.RelativeOrAbsolute)); spriteTransform.TranslateX = -558; spriteTransform.TranslateY = 0; SetValue(SpriteProperty, value); } } public static DependencyProperty SpriteProperty = DependencyProperty.Register( "Sprite", typeof(Sprite), typeof(spriteView), new PropertyMetadata(new Quiz.Sprite() { spriteSheet = "wp7_buttons.png" })); } 

How do I get that part of the running set method, as I read in the Dependency Property docs, that SetValue and GetValue can be called directly when bound.

+4
source share
2 answers

That's right, you cannot use SetValue to introduce any logic. Instead, you should use PropertyValueChanged . Sort of:

 public Sprite Sprite { get { return (Quiz.Sprite)GetValue(SpriteProperty); } set { SetValue(SpriteProperty, value); } } private static void OnSpritPropertyValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = d as YourControl; var sprite = e.NewValue as Quiz.Sprite; control.spriteBrush.ImageSource = new BitmapImage(new Uri("/Project;component/" + sprite.spriteSheet, UriKind.RelativeOrAbsolute)); control.spriteTransform.TranslateX = -558; control.spriteTransform.TranslateY = 0; } public static DependencyProperty SpriteProperty = DependencyProperty.Register( "Sprite", typeof(Sprite), typeof(spriteView), new PropertyMetadata(new Quiz.Sprite() { spriteSheet = "wp7_buttons.png" }, OnSpritPropertyValueChanged)); 
+3
source

Add DependencyPropertyChangedEventHandler and move the code from your setter there:

 public Sprite Sprite { get { return (Quiz.Sprite)GetValue(SpriteProperty); } set { SetValue(SpriteProperty, value); } } public static DependencyProperty SpriteProperty = DependencyProperty.Register( "Sprite", typeof(Sprite), typeof(SpriteView), new PropertyMetadata(new Quiz.Sprite() { spriteSheet = "wp7_buttons.png" }, SpriteChanged)); private static void SpriteChanged(object sender, DependencyPropertyChangedEventArgs e) { SpriteView view = sender as SpriteView; Sprite sprite = e.NewValue as Sprite; if (view != null && sprite != null) { view.spriteBrush.ImageSource = new BitmapImage(new Uri("/Project;component/" + sprite.spriteSheet, UriKind.RelativeOrAbsolute)); view.spriteTransform.TranslateX = -558; view.spriteTransform.TranslateY = 0; } } 
+3
source

All Articles