Propiedades adjuntas

Ejemplo de descarga Descarga del ejemplo

Las propiedades adjuntas permiten a un objeto asignar un valor para una propiedad que su propia clase no define. Por ejemplo, los elementos secundarios pueden usar propiedades adjuntas para informar a su elemento primario de cómo se van a presentar en la interfaz de usuario. El control permite especificar la fila y la columna de un elemento Grid secundario estableciendo las Grid.Row propiedades Grid.Column adjuntas y . Grid.Row y Grid.Column son propiedades adjuntas porque se establecen en elementos que son elementos secundarios de Grid , en lugar de en el propio Grid .

Las propiedades enlazables deben implementarse como propiedades adjuntas en los escenarios siguientes:

  • Cuando es necesario tener un mecanismo de configuración de propiedades disponible para clases que no son la clase de definición.
  • Cuando la clase representa un servicio que debe integrarse fácilmente con otras clases.

Para obtener más información sobre las propiedades enlazables, vea Propiedades enlazables.

Creación de una propiedad adjunta

El proceso para crear una propiedad adjunta es el siguiente:

  1. Cree una BindableProperty instancia con una de las CreateAttached sobrecargas del método .
  2. Proporcione staticGetstatic y SetGet como accessors para la propiedad adjunta.

Creación de una propiedad

Al crear una propiedad adjunta para su uso en otros tipos, la clase donde se crea la propiedad no tiene que derivar de BindableObject . Sin embargo, la propiedad de destino para los accessors debe ser de o derivar de .

Una propiedad adjunta se puede crear declarando una public static readonly propiedad de tipo BindableProperty . La propiedad enlazable debe establecerse en el valor devuelto de uno de los valores de Xamarin_Forms _BindableProperty_CreateAttached_System_String_System_Type_System_Type_System_Object_ Xamarin_Forms _BindingMode_ Xamarin_Forms _BindableProperty_ValidateValueDelegate_ _BindableProperty_BindingPropertyChangedDelegate_ _BindableProperty_BindingPropertyChangingDelegate_ _BindableProperty_CoerceValueDelegate_ Xamarin_FormsXamarin_FormsXamarin_FormsXamarin_Forms _BindableProperty_CreateDefaultValueDelegate_" data-linktype=" absolute-path">BindableProperty.CreateAttached sobrecargas del método. La declaración debe estar dentro del cuerpo de la clase propietaria, pero fuera de cualquier definición de miembro.

Importante

La convención de nomenclatura para las propiedades adjuntas es que el identificador de propiedad adjunta debe coincidir con el nombre de propiedad especificado en el método , con CreateAttached "Property" anexado.

En el código siguiente se muestra un ejemplo de una propiedad adjunta:

public static readonly BindableProperty HasShadowProperty =
  BindableProperty.CreateAttached ("HasShadow", typeof(bool), typeof(ShadowEffect), false);

Esto crea una propiedad adjunta denominada HasShadowProperty , de tipo bool . La propiedad es propiedad de la ShadowEffect clase y tiene un valor predeterminado de false .

Para obtener más información sobre cómo crear propiedades enlazables, incluidos los parámetros que se pueden especificar durante la creación, vea Crear una propiedad enlazable.

Creación de los accessors

Los GetGet y SetSet estáticos son necesarios como accessors para la propiedad adjunta; de lo contrario, el sistema de propiedades no podrá usar la propiedad adjunta. El GetGet debe cumplir la firma siguiente:

public static valueType GetPropertyName(BindableObject target)

El GetGet debe devolver el valor contenido en el campo BindableProperty correspondiente para la propiedad adjunta. Esto se puede lograr llamando al método Xamarin_Forms _BindableObject_GetValue_ Xamarin_Forms _BindableProperty_" data-linktype="absolute-path">, pasando el identificador de propiedad enlazable en el que se va a obtener el valor y, a continuación, convierte el valor resultante al GetValue tipo necesario.

El SetSet debe cumplir la firma siguiente:

public static void SetPropertyName(BindableObject target, valueType value)

El SetSet debe establecer el valor del campo BindableProperty correspondiente para la propiedad adjunta. Esto se puede lograr llamando al método Xamarin_Forms data-linktype="absolute-path">de Xamarin_Forms _BindableProperty_System_Object_ _BindableObject_SetValue_", pasando el identificador de propiedad enlazable en el que se va a establecer el valor y el valor que se va a SetValue establecer.

Para ambos accessors, el objeto de destino debe ser de o derivar de .

En el ejemplo de código siguiente se muestran los accessors para la HasShadow propiedad adjunta:

public static bool GetHasShadow (BindableObject view)
{
  return (bool)view.GetValue (HasShadowProperty);
}

public static void SetHasShadow (BindableObject view, bool value)
{
  view.SetValue (HasShadowProperty, value);
}

Consumo de una propiedad adjunta

Una vez creada una propiedad adjunta, se puede consumir desde XAML o código. En XAML, esto se logra declarando un espacio de nombres con un prefijo, con la declaración de espacio de nombres que indica el nombre del espacio de nombres de Common Language Runtime (CLR) y, opcionalmente, un nombre de ensamblado. Para obtener más información, vea Espacios de nombres XAML.

En el ejemplo de código siguiente se muestra un espacio de nombres XAML para un tipo personalizado que contiene una propiedad adjunta, que se define dentro del mismo ensamblado que el código de aplicación que hace referencia al tipo personalizado:

<ContentPage ... xmlns:local="clr-namespace:EffectsDemo" ...>
  ...
</ContentPage>

A continuación, la declaración de espacio de nombres se usa al establecer la propiedad adjunta en un control específico, como se muestra en el siguiente ejemplo de código XAML:

<Label Text="Label Shadow Effect" local:ShadowEffect.HasShadow="true" />

El código de C# equivalente se muestra en el ejemplo de código siguiente:

var label = new Label { Text = "Label Shadow Effect" };
ShadowEffect.SetHasShadow (label, true);

Consumo de una propiedad adjunta con un estilo

Las propiedades adjuntas también se pueden agregar a un control mediante un estilo. En el ejemplo de código XAML siguiente se muestra un estilo explícito que usa la propiedad adjunta, que se puede aplicar a Label los controles:

<Style x:Key="ShadowEffectStyle" TargetType="Label">
  <Style.Setters>
    <Setter Property="local:ShadowEffect.HasShadow" Value="true" />
  </Style.Setters>
</Style>

Se puede aplicar a estableciendo su propiedad StyleLabel Xamarin_Forms Style _NavigableElement_Style" data-linktype="absolute-path">en StyleStyle la instancia mediante la StaticResource extensión de marcado, como se muestra en el ejemplo de código siguiente:

<Label Text="Label Shadow Effect" Style="{StaticResource ShadowEffectStyle}" />

Para obtener más información sobre los estilos, vea Estilos.

Escenarios avanzados

Al crear una propiedad adjunta, hay una serie de parámetros opcionales que se pueden establecer para habilitar escenarios avanzados de propiedades adjuntas. Esto incluye la detección de cambios de propiedad, la validación de valores de propiedad y la coerción de valores de propiedad. Para obtener más información, vea Escenarios avanzados.