Propiedades de dependencia de sólo lectura

Actualización: noviembre 2007

En este tema se describen las propiedades de dependencia de sólo lectura; se incluyen las ya existentes, así como los escenarios y las técnicas para crear una personalizada.

Este tema contiene las secciones siguientes.

  • Requisitos previos
  • Propiedades de la dependencia de sólo lectura existentes
  • Crear propiedades de dependencia de sólo lectura personalizadas
  • Temas relacionados

Requisitos previos

En este tema se supone que entiende los escenarios básicos de la implementación de una propiedad de dependencia, así como la aplicación de una propiedad a una propiedad de dependencia personalizada. Vea Propiedades de dependencia personalizadas y Metadatos de las propiedades de dependencia para obtener contexto.

Propiedades de la dependencia de sólo lectura existentes

Algunas de las propiedades de dependencia definidos en el marco de trabajo de Windows Presentation Foundation (WPF) son de sólo lectura. El motivo habitual típica para especificar una propiedad de dependencia de sólo lectura es que se trata de propiedades deben utilizarse para determinar el estado en casos en que hay muchos factores que afectan a este último, pero en los que limitarse a establecer la propiedad en ese estado no es deseable desde el punto de vista del diseño de la interfaz de usuario. Por ejemplo, la propiedad IsMouseOver se limita, en realidad, a exponer el estado determinado por la entrada de mouse. Cualquier intento de establecer este valor mediante programación y eludir la entrada de mouse real sería imprevisible y daría lugar a incoherencias.

Al no poder establecerse, las propiedades de dependencia de sólo lectura no son adecuadas para muchos de los escenarios en que las propiedades de dependencia suelen ofrecer una solución (a saber: enlace de datos, aplicación de un estilo directo a un valor, validación, animación o herencia). A pesar de no poderse establecer, las propiedades de dependencia de sólo lectura conservan algunas de las funciones adicionales que admiten las propiedades de dependencia en el sistema de propiedades. De éstas, la más importante es la capacidad de ser utilizadas como desencadenador de propiedad en un estilo. Los desencadenadores no se pueden habilitar con una propiedad common language runtime (CLR) normal; se necesita una propiedad de dependencia. La propiedad IsMouseOver mencionada anteriormente es un ejemplo perfecto de un escenario donde podría resultar de gran utilidad definir un estilo para un control, donde alguna propiedad visible, como el fondo, el primero plano u otras propiedades similares de elementos compuestos dentro del control cambiará cuando el usuario sitúe un mouse sobre alguna zona definida del control. Los procesos de invalidación inherentes al sistema de propiedades pueden detectar y comunicar los cambios de una propiedad de dependencia de sólo lectura, lo que constituye la compatibilidad interna con la funcionalidad de desencadenador de propiedad.

Crear propiedades de dependencia de sólo lectura personalizadas

Asegúrese de leer la sección anterior sobre los motivos por los que las propiedades de dependencia de sólo lectura no funcionan en muchos escenarios de propiedades de dependencia típicos. Sin embargo, si el escenario es el adecuado, puede ser conveniente crear su propia propiedad de dependencia de sólo lectura.

Gran parte del proceso de creación de una propiedad de dependencia de sólo lectura es igual al descrito en los temas Propiedades de dependencia personalizadas y Cómo: Implementar una propiedad de dependencia. Hay tres diferencias importantes:

  • Al registrar la propiedad, llame al método RegisterReadOnly en lugar de al método Register normal para el registro de propiedades.

  • Al implementar la propiedad de "contenedor" de CLR, asegúrese de que tampoco el contenedor tenga una implementación de establecimiento, de tal forma que no haya ninguna incoherencia en el estado de sólo lectura para el contenedor público que se expone.

  • El objeto devuelto por el registro de sólo lectura es DependencyPropertyKey en lugar de DependencyProperty. Este campo debe almacenarse igualmente como miembro, pero no es habitual convertirlo en un miembro público del tipo.

Por supuesto, el valor o campo privado que respalda la propiedad de dependencia de sólo lectura puede ser de lectura y escritura con la lógica que usted decida. Sin embargo, la manera más sencilla de establecer la propiedad, ya sea inicialmente o como parte de lógica de tiempo de ejecución, es utilizar las API del sistema de propiedades, en lugar de eludir el sistema de propiedades y establecer directamente el campo de respaldo privado. En particular, existe una firma de SetValue que acepta un parámetro de tipo DependencyPropertyKey. Cómo y dónde se establezca este valor mediante programación dentro de la lógica de la aplicación afectará a cómo se establecerá el acceso en la DependencyPropertyKey creada al registrar la propiedad de dependencia por primera vez. Si toda esta lógica se administra dentro de la clase, puede hacerlo privado, pero si requiere que se establezca desde otro componente del ensamblado, puede establecerlo como interno. Un enfoque consiste en llamar a SetValue dentro de un controlador de eventos de clase de un evento pertinente que comunique a una instancia de clase que es preciso cambiar el valor almacenado de la propiedad. Otro enfoque consiste en vincular las propiedades de dependencia entre sí mediante devoluciones de llamada PropertyChangedCallback y CoerceValueCallback emparejadas como parte de los metadatos de esas propiedades durante el registro.

Dado que DependencyPropertyKey es privada, y que el sistema de propiedades no la propaga fuera del código, una propiedad de dependencia de sólo lectura aporta mayor seguridad de establecimiento que una propiedad de dependencia de lectura y escritura. Para una propiedad de dependencia de lectura y escritura, el campo de identificación es público de manera explícita o implícita, con lo que la propiedad se puede establecer ampliamente. Para obtener información más específica, vea Seguridad de las propiedades de dependencia.

Vea también

Conceptos

Información general sobre las propiedades de dependencia

Propiedades de dependencia personalizadas

Aplicar estilos y plantillas