Propiedades de dependencia de sólo lectura

En este tema se describen las propiedades de dependencia de solo lectura, incluidas las propiedades de dependencia de solo lectura existentes y los escenarios y las técnicas para crear una propiedad de dependencia de solo lectura personalizada.

Requisitos previos

En este tema se supone que entiende los escenarios básicos de la implementación de una propiedad de dependencia y cómo se aplican los metadatos a una propiedad de dependencia personalizada. Consulte Propiedades de dependencia personalizadas y Metadatos de las propiedades de dependencia para obtener contexto.

Propiedades de dependencia de solo lectura existentes

Algunas de las propiedades de dependencia definidas en el marco Windows Presentation Foundation (WPF) son de solo lectura. La razón típica para especificar una propiedad de dependencia de solo lectura es que son propiedades que se deben usar para determinar el estado, si ese estado depende de muchos factores, pero, simplemente, establecer la propiedad en ese estado no es deseable desde una perspectiva de diseño de la interfaz de usuario. Por ejemplo, la propiedad IsMouseOver simplemente muestra el estado determinado según la entrada del mouse. Cualquier intento de establecer este valor mediante programación y sortear la entrada de ratón real sería imprevisible y daría lugar a incoherencias.

Al no poder establecerse, las propiedades de dependencia de solo lectura no son adecuadas para muchos de los escenarios para los que las propiedades de dependencia suelen ofrecen una solución, es decir: enlace de datos, aplicar directamente estilos a un valor, validación, animación, herencia). A pesar de que no se pueden establecer, las propiedades de solo lectura todavía tienen algunas funciones adicionales que admiten las propiedades de dependencia en el sistema de propiedades. La funcionalidad restante más importante es que la propiedad de dependencia de solo lectura aún puede usarse como desencadenador de propiedad en un estilo. No puede habilitar desencadenadores con una propiedad de Common Language Runtime (CLR) normal: debe ser una propiedad de dependencia. La propiedad IsMouseOver mencionada antes es un ejemplo perfecto de escenario donde podría ser bastante útil definir un estilo para un control, donde cualquier propiedad visible, como un fondo, un primer plano, o cualquier otra propiedad similar de elementos compuestos dentro del control, cambiará cuando el usuario coloque el mouse sobre alguna región definida del control. Los procesos de invalidación inherentes del sistema de propiedades también pueden detectar y notificar los cambios en una propiedad de dependencia de solo lectura y, de hecho, esto admite la función de desencadenador de propiedad internamente.

Crear propiedades de dependencia de solo lectura

Asegúrese de leer la sección anterior sobre por qué no funcionan las propiedades de dependencia de solo lectura para muchos escenarios típicos de propiedades de dependencia. Pero si tiene un escenario adecuado, es posible que quiera crear su propia propiedad de dependencia de solo lectura.

Gran parte del proceso de creación de una propiedad de dependencia de solo lectura es el mismo que se describe en los temas Propiedades de dependencia personalizadas e Implementar una propiedad de dependencia. Hay tres diferencias importantes:

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

  • Al implementar la propiedad "wrapper" de CLR, asegúrese de que el contenedor no tenga tampoco ninguna implementación establecida, para que no haya ninguna incoherencia en el estado de solo lectura para el contenedor público que exponga.

  • El objeto devuelto por el registro de solo lectura es DependencyPropertyKey en lugar de DependencyProperty. Todavía debe almacenar este campo como miembro, pero, normalmente, no lo convertiría en un miembro público del tipo.

Por supuesto, cualquier valor o campo privado que respalde la propiedad de dependencia de solo lectura se puede escribir completamente con cualquier lógica que decida. Pero la manera más sencilla de establecer la propiedad inicialmente o como parte de la lógica en tiempo de ejecución consiste en usar API del sistema de propiedades, en lugar de omitirlo y establecer directamente el campo de respaldo privado. En concreto, existe una firma de SetValue que acepta un parámetro de tipo DependencyPropertyKey. Cómo y dónde se establece este valor mediante programación dentro de la lógica de la aplicación afectará a cómo quiere establecer el acceso al objeto DependencyPropertyKey creado al registrar por primera vez la propiedad de dependencia. Si controla toda esta lógica dentro de la clase, puede hacerla privada o, si necesita establecerla desde otras partes del ensamblado, puede establecerla como interna. Un enfoque consiste en llamar al objeto SetValue dentro de un controlador de eventos de clase de un evento pertinente que informa a una instancia de clase que es necesario cambiar el valor de propiedad almacenado. Otro enfoque consiste en vincular las propiedades de dependencia mediante devoluciones de llamada PropertyChangedCallback y CoerceValueCallback emparejadas como parte de los metadatos de esas propiedades durante el registro.

Como el objeto DependencyPropertyKey es privado y el sistema de propiedades no lo propaga fuera del código, una propiedad de dependencia de solo lectura tiene mejor seguridad de establecimiento que una propiedad de dependencia de lectura y escritura. Para una propiedad de dependencia de solo lectura, el campo de identificación es explícitamente o implícitamente público y, por lo tanto, se puede establecer la propiedad. Para obtener más información específica, consulte Seguridad de las propiedades de dependencia.

Vea también