2009-04-29 6 views
7

Nous avons un objet dérivé de DependencyObject et implémente des DependencyProperties.Propriétés de dépendance personnalisées et liaison TwoWay dans WPF

Fondamentalement, quelque chose comme ceci:

class Context : DependencyObject { 
    public static readonly DependencyProperty NameProperty = 
    DependencyProperty.Register ("Name", typeof (string), typeof (Context), new PropertyMetadata ("")); 
    public string Name { 
     get { 
      return (string)this.GetValue (NameProperty); 
     } 
     set { 
      this.SetValue (NameProperty, value); 
     } 
    } 
} 

Cela fonctionne, la propriété est configuré, peut être lié, etc. La question est quand je lie aux propery de WPF, en utilisant une liaison de TwoWay. La partie TwoWay n'arrive jamais, WPF n'appelle jamais l'ensemble de cette propriété. J'ai mis ma pansant comme ceci:

<TextBox Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

Dans ce cas, en tapant dans la zone de texte devrait immédiatement mettre à jour la propriété Name, mais il ne fonctionne pas. Si je change la propriété Name pour qu'elle soit une propriété POCO régulière, cela fonctionne (bien que l'autre côté de TwoWay ne le fasse évidemment pas à moins que j'implémente INotifyPropertyChanged).

Qu'est-ce que je fais mal ici? Cela devrait être une chose très simple à faire, mais cela ne me cause pas de mal de tête.

Répondre

11

Ce comportement est attendu. La propriété CLR est simplement un wrapper autour du sous-jacente DependencyProperty. WPF optimise souvent en appelant directement GetValue et SetValue. Si vous avez besoin d'une logique personnalisée à exécuter, utilisez les métadonnées du DependencyProperty.

+0

Décidément, je suis un idiot. Vous êtes 100% correct, la valeur elle-même est définie correctement, mais le setter n'est jamais appelé, ce qui est ce qui me traverse. Merci. –

2

Après cette question m'a coûté un peu de temps:

Pour ceux d'entre vous qui ont le même problème, mais - comme moi - ne voient pas la solution dans la réponse ci-dessus:

Pour soutenir l'héritage de DataContext, la classe personnalisée (Contexte dans ce cas) doit être dérivée de FrameworkElement plutôt que DependencyObject. C'est tout.

Marc

Questions connexes