Question

Nous avons un objet dérivé de DependencyObject et implémentant des propriétés DependencyProperties.

En gros, 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 setup, peut être liée, etc. Le problème survient lorsque je lie à la propriété de WPF, à l'aide d'une liaison TwoWay. La partie TwoWay ne se produit jamais, WPF n'appelle jamais l'ensemble de cette propriété. J'ai mis ma liaison comme ceci:

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

Dans ce cas, taper dans la zone de texte devrait immédiatement mettre à jour la propriété Name, mais ce n'est pas le cas. Si je modifie la propriété Name pour qu'elle devienne une propriété POCO normale, cela fonctionne (bien que l'autre côté du TwoWay ne fonctionne évidemment pas, sauf si 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 maux de tête.

Était-ce utile?

La solution

Ceci est le comportement attendu. La propriété CLR est simplement un wrapper autour du DependencyProperty sous-jacent. 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 de DependencyProperty .

Autres conseils

Après que cette question m’a coûté du temps:

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

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

Marc

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top