2010-04-19 8 views
1

Je ne suis pas sûr d'avoir la bonne compréhension de cela ou pas, ce que j'ai lu semble être d'accord avec ce que j'essaie de faire, mais il ne semble pas travailler.Utilisation des propriétés de dépendance dans wpf

Si j'ajoute un propriétaire supplémentaire à une propriété de dépendance d'une classe, à chaque fois que la classe d'origine dp change, la modification doit être propagée au propriétaire supplémentaire, correct? Ce que j'ai est un contrôle personnalisé, sur lequel je veux définir une propriété, puis sur certains objets qui sont dans le modèle de données de contrôle personnalisé hériter cette valeur de propriété.

 
public class Class1: DependencyObject{ 
    public static readonly DependencyProperty LongDayHeadersProperty; 

    public bool LongDayHeaders { 
    get { return (bool)GetValue(LongDayHeadersProperty); } 
    set { SetValue(LongDayHeadersProperty, value); } 
    } 

    static Class1(){ 
    LongDayHeadersProperty = DependencyProperty.Register("LongDayHeaders", typeof(bool), typeof(Class1), 
      new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.Inherits)); 
    } 
} 

public class Class2: DependecyObject{ 
    public static readonly DependencyProperty LongDayHeadersProperty; 

    public bool LongDayHeaders{ 
    get{ return(bool)GetValue(LongDayHeadersProperty); } 
    set{ SetValue(LongDayHeadersProperty, value); } 
    } 

    static Class2(){ 
    LongDayHeadersProperty = Class1.LongDayHeadersProperty.AddOwner(typeof(Class2)); 
    } 
} 

Mais si j'attribue un DependencyPropertyDescriptor aux deux propriétés, il ne se déclenche que pour les classes 1 et Classe2 ne change pas.

Ai-je manqué quelque chose dans ma compréhension?

MISE À JOUR

Après quelques tests, je ne suis même pas sûr si mon contrôle enfant est considéré comme un contrôle enfant dans l'arbre logique ou visuel. Je pense que c'est le cas, mais le manque de succès me conduit à croire le contraire.

Il existe de nombreux class2 qui existent dans une collection observable de classe1. Cela, à moi, les rend les enfants de classe1? Mais même si j'utilise RegisterAttach sur class2 et que je place la propriété dans class1, cela ne semble pas avoir d'effet?

Répondre

0

En tant que MSDN états, le drapeau Inherits fonctionne uniquement lorsque vous utilisez RegisterAttached pour créer la propriété. Vous pouvez toujours utiliser la syntaxe de propriété pour la propriété.

Mise à jour

Pour plus de clarté, voici comment je définirais les propriétés:

public class Class1 : FrameworkElement 
{ 
    public static readonly DependencyProperty LongDayHeadersProperty = 
     DependencyProperty.RegisterAttached("LongDayHeaders", 
     typeof(bool), 
     typeof(Class1), 
     new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.Inherits)); 

    public bool LongDayHeaders 
    { 
     get { return (bool)GetValue(LongDayHeadersProperty); } 
     set { SetValue(LongDayHeadersProperty, value); } 
    } 
} 

public class Class2: FrameworkElement 
{ 
    public static readonly DependencyProperty LongDayHeadersProperty = 
     Class1.LongDayHeadersProperty.AddOwner(typeof(Class2)); 

    public bool LongDayHeaders 
    { 
     get{ return(bool)GetValue(LongDayHeadersProperty); } 
     set{ SetValue(LongDayHeadersProperty, value); } 
    } 
} 

Si vous voulez que vos enfants soient des enfants logiques de votre contrôle, vous devez appeler le AddLogicalChild. En outre, vous devez les exposer via la propriété LogicalChildren. Je dois également souligner que les deux classes doivent dériver de FrameworkElement ou FrameworkContentElement, car l'arbre logique est seulement défini pour ces éléments.

Étant donné que vous utilisez un ObservableCollection, vous devez gérer la collecte des événements modifiés et ajouter/supprimer les enfants en fonction du changement. En outre, la propriété LogicalChildren peut simplement renvoyer l'énumérateur de votre collection.

+0

RegisterAttached fait la propriété de la classe 2, classe 1. applyable sur donc: Mais je je veux juste aller Psytronic

+0

que sténographie n'est pas possible –

0

Vous confondez DependencyProperties avec les propriétés attachées (dépendances). Un DP est pour quand une classe veut se lier, propriétés stylables etc sur lui-même. Tout comme les propriétés .NET, elles sont définies dans leurs classes. Vous pouvez vous inscrire pour un événement modifié de propriété sur des objets individuels, mais pas globalement. TextBox.Text est un exemple de ceci. Notez que Label.Text est sans rapport avec TextBox.Text. Un AP est pour quand une classe veut décorer un autre objet avec des propriétés supplémentaires. La classe qui déclare que le point d'accès est capable d'écouter la propriété a changé les événements sur TOUTES les instances d'autres objets qui ont cet ensemble d'AP. Toile.Gauche est un exemple de ceci. Notez que vous devez toujours qualifier ce compositeur: <Label Text="Hi" Canvas.Left="50"/>

Questions connexes