2017-07-04 1 views
0

Dans l'exemple suivant de mon contrôle personnalisé, pourquoi je ne peux pas changer un TransparentColor propriété dans un setter d'un SelectedColor propriété? Une solution avec la méthode de rappel fonctionne bien, quelle est la différence entre eux dans le cas de changer une autre propriété?WPF - Modifier la propriété Valeur en Setter d'une autre propriété


public class MyColorPicker : Control 
{ 
    static MyColorPicker() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(MyColorPicker), new FrameworkPropertyMetadata(typeof(MyColorPicker))); 
    } 

    public static readonly DependencyProperty SelectedColorProperty = 
      DependencyProperty.Register("SelectedColor", typeof(Color), typeof(MyColorPicker), new PropertyMetadata(Color.FromRgb(0, 201, 201), OnSelectedColorChange)); 

    private static void OnSelectedColorChange(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     var colorPicker = (MyColorPicker)sender; 
     var selectedColor = colorPicker.SelectedColor; 
     colorPicker.TransparentColor = Color.FromArgb(0, selectedColor.R, selectedColor.G, selectedColor.B); 
    } 

    public Color SelectedColor 
    { 
     get { return (Color)GetValue(SelectedColorProperty); } 
     set 
     { 
      // Why this not working? BorderStopColor = Color.FromArgb(0, value.R, value.G, value.B); 
      SetValue(SelectedColorProperty, value); 
     } 
    } 

    private static readonly DependencyPropertyKey TransparentColorPropertyKey = 
      DependencyProperty.RegisterReadOnly("TransparentColor", typeof(Color), typeof(MyColorPicker), new PropertyMetadata(Color.FromArgb(0, 0, 201, 201))); 

    public static readonly DependencyProperty TransparentColorProperty = TransparentColorPropertyKey.DependencyProperty; 

    public Color TransparentColor 
    { 
     get { return (Color)GetValue(TransparentColorProperty); } 
     protected set { SetValue(TransparentColorPropertyKey, value); } 
    } 
} 

Répondre

1

Le poseur d'une enveloppe de CLR pour une propriété de dépendance devrait seulement appel de la méthode SetValue pour définir la valeur réelle de la propriété de dépendance.

Toute autre logique doit être implémentée dans le rappel.

Notez également que les enveloppes de propriété CLR sont contournés lors de l'exécution lors de la configuration des propriétés de dépendance en XAML (mais les callbacks ne sont pas):

Why are .NET property wrappers bypassed at runtime when setting dependency properties in XAML?