Domanda

Abbiamo un oggetto che deriva da DependencyObject e implementa alcune DependencyProperties.

Fondamentalmente qualcosa del genere:

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);
        }
    }
}

Funziona, la proprietà è impostata, può essere associata, ecc. Il problema si presenta quando associo TO alla proprietà di WPF, usando un binding TwoWay. La parte TwoWay non accade mai, WPF non chiama mai il set di questa proprietà. Ho impostato la mia associazione in questo modo:

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

In questo caso, digitando nella casella di testo è necessario aggiornare immediatamente la proprietà Name, ma non è così. Se cambio la proprietà Name in modo che sia una normale proprietà POCO, funziona (anche se l'altro lato di TwoWay ovviamente non funziona se non implemento INotifyPropertyChanged).

Cosa sto facendo di sbagliato qui? Questa dovrebbe essere una cosa davvero semplice da fare, ma non mi sta causando la fine del mal di testa.

È stato utile?

Soluzione

Questo è un comportamento previsto. La proprietà CLR è semplicemente un wrapper attorno al DependencyProperty sottostante. WPF spesso ottimizza chiamando direttamente GetValue e SetValue . Se hai bisogno di una logica personalizzata da eseguire, usa i metadati di DependencyProperty .

Altri suggerimenti

Dopo questo problema mi è costato un po 'di tempo:

Per quelli di voi che hanno lo stesso problema, ma - come me - non vedono la soluzione nella risposta sopra:

Per supportare l'ereditarietà di DataContext, la classe personalizzata (in questo caso il contesto) deve essere derivata da FrameworkElement piuttosto che DependencyObject . Questo è tutto.

Marc

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top