2012-08-10 5 views
6

He creado una propiedad de dependencia de esta manera:¿Cómo el get/set en la propiedad de dependencia no hace nada?

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

    //... 
} 

A continuación, se unen a mi ventana de WPF y todo funcionaba bien.

Cuando traté de agregar lógica al colocador noté que no se estaba llamando. Modifico el get; Establecido en un punto ahora se ven así:

get{return null;} 
set{} 

¡Y todavía funciona! ¿Cómo? ¿Para qué sirven las llamadas a GetValue/SetValue?

+0

Consulte también [aquí] (http://msdn.microsoft.com/en-us/library/bb613563.aspx#implications) para saber por qué no debe poner ninguna lógica adicional en los contenedores de propiedad. – Clemens

Respuesta

6

La infraestructura de enlace de datos de WPF usa DependencyProperty directamente, la propiedad Xyz es una interfaz práctica para el programador.

Eche un vistazo a PropertyMetadata en la llamada a DependencyProperty.Register, puede proporcionar una devolución de llamada que se ejecutará cuando se cambie el valor de la propiedad, aquí es donde puede aplicar su lógica comercial.

+0

Ya veo. Pero todavía lo necesito ¿verdad? Intenté eliminarlo de la fuente y obviamente el compilador se quejó – OscarRyz

+0

Solo necesita la propiedad si hace referencia a ella en su código. De lo contrario, no es necesario. Si está vinculando declarativamente, usará el nombre 'Xyz', pero se resolverá en su propiedad de dependencia sin necesidad de la propiedad del miembro. –

1

DependencyProperty es la tienda de respaldo para XyzProperty. Si accede a la propiedad a través de la interfaz DependencyProperty, pasa por alto completamente el acceso Get/Set de la propiedad.

creo que de esta manera:

private int _myValue = 0; 

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

En este caso, si le asigno manualmente _myValue = 12, obviamente, el "ajuste" de acceso a la propiedad MyValue no se llamará; ¡Lo evité por completo! Lo mismo es cierto para DependencyProperties. El sistema de enlace de WPF usa las interfaces DependencyProperty directamente.

+0

Es por eso que tengo que llamar a GetValue/SetValue ¿verdad? En caso de que invoque directamente 'this.Xyz =" newValue ";' – OscarRyz

+0

Right. El contenedor de propiedades Get/Set es conveniente para usted, pero en última instancia es irrelevante para el sistema vinculante de WPF. – BTownTKD

Cuestiones relacionadas