2009-10-15 5 views
2

J'ai une propriété attachée personnalisée mais les accesseurs ne sont jamais accédés sur la liaison de données. Ces accesseurs sont-ils destinés à être accédés chaque fois que la propriété attachée change?Obtenir ou définir l'accesseur de la propriété attachée ne se déclenche-t-il pas sur le databind? WPF

public static readonly DependencyProperty CharacterColumnNumberProperty = 
     DependencyProperty.RegisterAttached("CharacterColumnNumber", typeof(int), typeof(DragCanvas), new UIPropertyMetadata(1)); 

    public static int GetCharacterColumnNumber(UIElement uiElement) 
    { 
     if (uiElement != null) 
      return (int)uiElement.GetValue(CharacterColumnNumberProperty); 
     else return 0; 
    } 

    public static void SetCharacterColumnNumber(UIElement uiElement, int value) 
    { 
     if (uiElement != null) 
     { 
      uiElement.SetValue(CharacterColumnNumberProperty, value); 
      DragCanvas.SetLeft(uiElement, value * 10); 
     } 
    } 

XAML:

<Setter Property="local:DragCanvas.CharacterColumnNumber" Value="{Binding Path=CharacterColumnNumber, Mode=TwoWay}" /> 
+1

Les liaisons n'accèdent pas aux propriétés: elles utilisent l'objet de dépendance sous-jacent et les structures de liaison pour accéder aux valeurs des propriétés de dépendance. Celui-ci m'a surpris aussi, quand j'ai commencé à déconner avec DP. Il y a beaucoup de choses sous les couvertures dans WPF. – Will

+0

Pourquoi l'infrastructure (ou l'éditeur xaml) nécessite-t-elle que les accesseurs se conforment à la convention de dénomination s'ils ne sont même pas utilisés par le système de propriétés WPF? –

Répondre

4

Non, ils ne sont pas. Si vous voulez savoir quand le moteur de propriétés interne modifie ces valeurs, vous passez un délégué pour le paramètre PropertyChangedCallback de UIPropertyMetadata.

Ce délégué sera appelé chaque fois que la propriété est modifiée, qu'elle provienne de la propriété CLR ou de modifications internes du moteur de propriétés de dépendance (liaisons).

+0

Merci pour la réponse, cela a du sens. Mais comme j'ai compris les propriétés attachées est que l'un des usages les plus fréquents est de changer la mise en page. Le paramètre PropertyChangedCallback me donnerait-il la meilleure option pour changer le Canvas.Left de l'UIElement lorsque le CharacterColumnNumber change? ie: Canvas.Left = CharacterColumnNumber * 10. Juste pour réitérer, je voudrais attacher la valeur CharacterColumnNumber à l'emplacement sur le canevas. –

+0

Après avoir écrit le dernier commentaire, j'ai pensé à utiliser un convertisseur, peut-être une meilleure option? Mais si je ne voulais pas utiliser un convertisseur, ce qui précède serait-il le meilleur moyen? Merci. –

Questions connexes