Nota
O acceso a esta páxina require autorización. Pode tentar iniciar sesión ou modificar os directorios.
O acceso a esta páxina require autorización. Pode tentar modificar os directorios.
Nota:
Este contenido se vuelve a imprimir con el permiso de Pearson Education, Inc. de Directrices de diseño de frameworks: Convenciones, expresiones y patrones para bibliotecas reutilizables de .NET, 2ª Edición. Esa edición fue publicada en 2008, y el libro ha sido totalmente revisado en la tercera edición. Parte de la información de esta página puede estar obsoleta.
Una propiedad de dependencia (DP) es una propiedad normal que almacena su valor en un almacén de propiedades en lugar de almacenarlo en una variable de tipo (campo), por ejemplo.
Una propiedad de dependencia adjunta es un tipo de propiedad de dependencia modelada como métodos estáticos Get y Set que representan "propiedades" que describen las relaciones entre los objetos y sus contenedores (por ejemplo, la posición de un Button objeto en un Panel contenedor).
✔️ Proporcione las propiedades de dependencia, si necesita las propiedades para admitir características de WPF como estilos, desencadenadores, enlace de datos, animaciones, recursos dinámicos y herencia.
Diseño de propiedades de dependencia
✔️ DO hereda de DependencyObject, o de uno de sus subtipos, al implementar propiedades de dependencia. El tipo proporciona una implementación muy eficaz de un almacén de propiedades y admite automáticamente el enlace de datos de WPF.
✔️ Proporcione una propiedad CLR normal y un campo estático de solo lectura público que almacene una instancia de System.Windows.DependencyProperty para cada propiedad de dependencia.
✔️ Implemente propiedades de dependencia realizando la llamada a los métodos de instancia DependencyObject.GetValue y DependencyObject.SetValue.
✔️ Asigne un nombre al campo estático de la propiedad de dependencia agregando "Property" al nombre de la propiedad.
❌ NO establezca valores predeterminados de propiedades de dependencia explícitamente en el código; establézcalos en metadatos en su lugar.
Si establece una propiedad de forma predeterminada explícitamente, puede impedir que esa propiedad se establezca por algún medio implícito, como un estilo.
❌ NO coloque código en los descriptores de acceso de propiedad distintos del código estándar para acceder al campo estático.
Ese código no se ejecutará si la propiedad se establece por medios implícitos, como un estilo, ya que el estilo usa el campo estático directamente.
❌ NO use propiedades de dependencia para almacenar datos seguros. Incluso se puede acceder a las propiedades de dependencia privadas públicamente.
Diseño de propiedades de dependencia adjuntas
Las propiedades de dependencia descritas en la sección anterior representan propiedades intrínsecas del tipo declarante; por ejemplo, la Text propiedad es una propiedad de TextButton, que la declara. Un tipo especial de propiedad de dependencia es la propiedad de dependencia adjunta.
Un ejemplo clásico de una propiedad adjunta es la propiedad Grid.Column. La propiedad representa la posición de la columna del botón (no de la cuadrícula), pero solo es relevante si el botón está contenido en una cuadrícula, por lo que se "adjunta" a los botones mediante cuadrículas.
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Grid.Column="0">Click</Button>
<Button Grid.Column="1">Clack</Button>
</Grid>
La definición de una propiedad adjunta se parece principalmente a la de una propiedad de dependencia normal, excepto que los descriptores de acceso se representan mediante métodos estáticos Get y Set:
public class Grid {
public static int GetColumn(DependencyObject obj) {
return (int)obj.GetValue(ColumnProperty);
}
public static void SetColumn(DependencyObject obj, int value) {
obj.SetValue(ColumnProperty,value);
}
public static readonly DependencyProperty ColumnProperty =
DependencyProperty.RegisterAttached(
"Column",
typeof(int),
typeof(Grid)
);
}
Validación de propiedades de dependencia
Las propiedades suelen implementar lo que se denomina validación. La lógica de validación se ejecuta cuando se intenta cambiar el valor de una propiedad.
Desafortunadamente, los descriptores de acceso de propiedad de dependencia no pueden contener código de validación arbitrario. En su lugar, es necesario especificar la lógica de validación de propiedades de dependencia durante el registro de propiedades.
❌ NO coloque la lógica de validación de propiedades de dependencia en los descriptores de acceso de la propiedad. En su lugar, pase una devolución de llamada de validación al método DependencyProperty.Register.
Notificaciones de cambio de propiedad de dependencia
❌ NO implemente la lógica de notificación de cambios en los accesores de propiedades de dependencia. Las propiedades de dependencia tienen una funcionalidad de notificación de cambios integrada que debe utilizarse proporcionando un método de retorno de notificación de cambios a PropertyMetadata.
Coerción de valor de propiedad de dependencia
La coerción de propiedades ocurre cuando el valor dado a un asignador de la propiedad es modificado por este antes de que el almacenamiento de la propiedad se modifique realmente.
❌ NO implemente lógica de coerción en los accesores de propiedades de dependencia.
Las propiedades de dependencia tienen una característica de coerción incorporada y se puede usar proporcionando un callback de coerción a PropertyMetadata.
© Partes 2005, 2009 de Microsoft Corporation. Todos los derechos reservados.
Reimpreso con permiso de Pearson Education, Inc. de Framework Design Guidelines: Convenciones, Idiomas y Patrones para Bibliotecas .NET Reusables, 2ª Edición por Krzysztof Cwalina y Brad Abrams, publicado el 22 de octubre de 2008 por Addison-Wesley Professional como parte de la Serie Desarrollo de Microsoft Windows.