Compartir a través de


Propiedades de dependencia de solo lectura

Puede usar propiedades de dependencia de solo lectura para evitar que los valores de propiedad se establezcan fuera del código. En este artículo se describen las propiedades de dependencia de solo lectura existentes y los escenarios y técnicas para crear una propiedad de dependencia de solo lectura personalizada.

Prerrequisitos

El artículo asume que tiene un conocimiento básico de las propiedades de dependencia y que ha leído Descripción general de las propiedades de dependencia. Para seguir los ejemplos de este artículo, le ayuda si está familiarizado con el lenguaje de marcado extensible de aplicaciones (XAML) y sabe cómo escribir aplicaciones WPF.

Propiedades de dependencia de solo lectura existentes

Normalmente, las propiedades de dependencia de solo lectura notifican el estado y no deben modificarse a través de un public descriptor de acceso. Por ejemplo, el marco de Windows Presentation Foundation (WPF) implementa la propiedad IsMouseOver como solo lectura, ya que su valor se debe determinar únicamente mediante entrada del ratón. Si IsMouseOver se permiten otras entradas, su valor podría ser incoherente con la entrada del mouse. Aunque no se puede configurar a través de un public descriptor de acceso, muchas propiedades de dependencia de solo lectura existentes tienen valores determinados por varias entradas.

Usos de propiedades de dependencia de solo lectura

Las propiedades de dependencia de solo lectura no son aplicables en varios escenarios donde las propiedades de dependencia suelen ofrecer una solución. Entre los escenarios no aplicables se incluyen el enlace de datos, la aplicación de un estilo a un valor, la validación, la animación y la herencia. Sin embargo, una propiedad de dependencia de solo lectura se puede usar como desencadenador de propiedad en un estilo. Por ejemplo, IsMouseOver se usa normalmente para desencadenar cambios en segundo plano, primer plano u otra propiedad visible de un control cuando el mouse está sobre él. El sistema de propiedades de WPF detecta e informa de los cambios en las propiedades de dependencia de solo lectura, lo que permite la funcionalidad de los desencadenadores de propiedades. Las propiedades de dependencia de solo lectura también son útiles al implementar una propiedad de dependencia de tipo de colección donde solo es necesario escribir los elementos de la colección, no el propio objeto de colección. Para obtener más información, vea Propiedades de dependencia de tipo de colección.

Nota:

Solo las propiedades de dependencia, no las propiedades normales de Common Language Runtime, se pueden usar como desencadenadores de propiedades en un estilo.

Creación de propiedades de dependencia de solo lectura personalizadas

Antes de crear una propiedad de dependencia que sea de solo lectura, compruebe los escenarios no aplicables.

El proceso de creación de una propiedad de dependencia de solo lectura es de muchas maneras similar a la creación de propiedades de dependencia de lectura y escritura, con estas distinciones:

  • Al registrar la propiedad de solo lectura, llame a RegisterReadOnly en lugar de Register.

  • Al implementar el contenedor de propiedades CLR, asegúrese de que no tiene un descriptor de acceso público set .

  • RegisterReadOnly devuelve DependencyPropertyKey en lugar de DependencyProperty. Almacene el DependencyPropertyKey en un miembro de clase no público.

Usted puede determinar el valor de su propiedad de dependencia de solo lectura usando la lógica que prefiera. La manera recomendada de establecer el valor de propiedad, inicialmente o como parte de la lógica en tiempo de ejecución, es usar la sobrecarga de SetValue que acepta un parámetro de tipo DependencyPropertyKey. El uso de SetValue es preferible para evadir el sistema de propiedades y establecer directamente el campo de respaldo.

Cómo y dónde se establece el valor de una propiedad de dependencia de solo lectura afectará al nivel de acceso que asigne al miembro de clase que almacena DependencyPropertyKey dentro de la aplicación. Si establece el valor de propiedad únicamente desde dentro de la clase que registra la propiedad de dependencia, puede usar un modificador de acceso private. En escenarios en los que los valores de las propiedades de dependencia se afectan entre sí, puede usar devoluciones de llamada emparejadas PropertyChangedCallback y CoerceValueCallback para desencadenar cambios de valor. Para obtener más información, consulte Metadatos de propiedad de dependencia.

Si necesita cambiar el valor de una propiedad de dependencia que es de solo lectura desde fuera de la clase que la registra, puede usar un internal modificador de acceso para el DependencyPropertyKey. Por ejemplo, puede invocar a SetValue desde un controlador de eventos que se encuentra en el mismo ensamblado. En el ejemplo siguiente se define una clase Aquarium que llama a RegisterReadOnly para crear la propiedad FishCount de dependencia solo de lectura. DependencyPropertyKey se asigna a un internal static readonly campo, de modo que el código del mismo ensamblado pueda cambiar el valor de la propiedad de dependencia de solo lectura.

public class Aquarium : DependencyObject
{
    // Register a dependency property with the specified property name,
    // property type, owner type, and property metadata.
    // Assign DependencyPropertyKey to a nonpublic field.
    internal static readonly DependencyPropertyKey FishCountPropertyKey =
        DependencyProperty.RegisterReadOnly(
          name: "FishCount",
          propertyType: typeof(int),
          ownerType: typeof(Aquarium),
          typeMetadata: new FrameworkPropertyMetadata());

    // Declare a public get accessor.
    public int FishCount =>
        (int)GetValue(FishCountPropertyKey.DependencyProperty);
}
Public Class Aquarium
    Inherits DependencyObject

    ' Register a dependency property with the specified property name,
    ' property type, owner type, And property metadata.
    ' Assign DependencyPropertyKey to a nonpublic field.
    Friend Shared ReadOnly FishCountPropertyKey As DependencyPropertyKey =
        DependencyProperty.RegisterReadOnly(
            name:="FishCount",
            propertyType:=GetType(Integer),
            ownerType:=GetType(Aquarium),
            typeMetadata:=New FrameworkPropertyMetadata())

    ' Declare a public get accessor.
    Public ReadOnly Property FishCount As Integer
        Get
            Return GetValue(FishCountPropertyKey.DependencyProperty)
        End Get
    End Property

End Class

Dado que el sistema de propiedades de WPF no propaga el DependencyPropertyKey código externo, las propiedades de dependencia de solo lectura tienen una mejor seguridad de escritura que las propiedades de dependencia de lectura y escritura. Utilice una propiedad de dependencia de solo lectura cuando desee limitar el acceso de escritura a quienes tengan una referencia al DependencyPropertyKey.

Por el contrario, el identificador de propiedad de dependencia para las propiedades de dependencia de lectura y escritura es accesible a través del sistema de propiedades, independientemente del modificador de acceso que asigne. Para obtener más información, consulte Seguridad de propiedades de dependencia.

Consulte también