2012-08-10 13 views
6

Ho creato una proprietà di dipendenza come questo:In che modo la proprietà di dipendenza get/set in non fa nulla?

public partial class MyControl: UserControl 
{ 
    //... 

    public static DependencyProperty XyzProperty = DependencyProperty.Register("Xyz",typeof (string),typeof (MyControl),new PropertyMetadata(default(string))); 

    public string Xyz 
    { 
     get { return (string) GetValue(XyzProperty); } 
     set { SetValue(XyzProperty , value); }    
    } 

    //... 
} 

quindi associare alla mia finestra WPF e tutto ha funzionato bene.

Quando ho provato ad aggiungere un po 'di logica al setter, ho notato che non veniva chiamato. Modifico il get; impostare fino a un punto ora assomigliano a questo:

get{return null;} 
set{} 

ed è ancora funziona! Come mai? A che cosa servono le chiamate GetValue/SetValue?

+0

Vedere anche [here] (http://msdn.microsoft.com/en-us/library/bb613563.aspx#implications) per il motivo per cui non si deve inserire alcuna logica aggiuntiva nei wrapper delle proprietà. – Clemens

risposta

6

L'infrastruttura di associazione dati WPF utilizza direttamente DependencyProperty, la proprietà Xyz è un'interfaccia di convenienza per il programmatore.

Dai uno sguardo a PropertyMetadata nella chiamata a DependencyProperty.Register, puoi fornire un callback che verrà eseguito quando il valore della proprietà viene modificato, in questo è possibile applicare la logica aziendale.

+0

Vedo. Ma ho ancora bisogno giusto? Ho provato a cancellarlo dal sorgente e ovviamente il compilatore si è lamentato – OscarRyz

+0

Hai solo bisogno della proprietà se stai facendo riferimento nel codice. Altrimenti non è necessario, se si assegna in modo dichiarativo si utilizzerà il nome "Xyz" ma si risolverà nella proprietà di dipendenza senza la proprietà del membro. –

1

DependencyProperty è il backing store per XyzProperty. Se si accede alla proprietà tramite l'interfaccia DependencyProperty, ignora completamente la funzione di accesso Get/Set della proprietà.

pensare in questo modo:

private int _myValue = 0; 

public int MyValue 
{ 
    get { return _myValue; } 
    set { _myValue = value; } 
} 

In questo caso, se assegnare manualmente _myValue = 12, ovviamente il "Set" non sarà chiamato di accesso per la proprietà MyValue; L'ho completamente scavalcato! Lo stesso vale per DependencyProperties. Il sistema di binding di WPF utilizza direttamente le interfacce di DependencyProperty.

+0

Ecco perché devo chiamare GetValue/SetValue giusto? Nel caso in cui invoco direttamente 'this.Xyz =" newValue ";' – OscarRyz

+0

A destra. Il wrapper di proprietà Ottieni/Imposta è conveniente per te, ma alla fine irrilevante per il sistema di binding di WPF. – BTownTKD

Problemi correlati