Compartir a través de


Sintaxis de property-path

Puedes usar la clase PropertyPath y la sintaxis de cadena para crear instancias de un valor PropertyPath en XAML o en código. Los valores propertyPath se usan mediante el enlace de datos. Se usa una sintaxis similar para dirigirse a animaciones con guion gráfico. En ambos escenarios, una ruta de acceso de propiedad describe un recorrido a través de una o varias relaciones objeto-propiedad que culminan en una sola propiedad.

Puedes establecer una cadena de ruta de propiedad directamente en un atributo en XAML. Puede usar la misma sintaxis de cadena para construir un PropertyPath que establece un binding en el código o para establecer un destino de animación en el código mediante SetTargetProperty. Hay dos áreas de características distintas en Windows Runtime que usan una ruta de acceso de propiedad: la vinculación de datos y el destino de animación. La segmentación de animación no crea valores de sintaxis de ruta de acceso de propiedad subyacentes en la implementación de Windows Runtime, mantiene la información como una cadena, pero los conceptos de recorrido de propiedades de objetos son muy similares. El enlace de datos y la animación evalúan una ruta de acceso de propiedad de manera ligeramente diferente, por lo que describimos la sintaxis de la ruta de acceso de propiedad por separado para cada uno.

Ruta de propiedad para objetos en la vinculación de datos

En Windows Runtime, puedes enlazar al valor de destino de cualquier propiedad de dependencia. El valor de la propiedad de origen de un enlace de datos no tiene que ser una propiedad de dependencia; puede ser una propiedad en un objeto de negocio (por ejemplo, una clase escrita en un lenguaje .NET de Microsoft o C++). O bien, el objeto de origen del valor de enlace puede ser un objeto de dependencia existente ya definido por la aplicación. Se puede hacer referencia al origen por un nombre de propiedad simple o por un recorrido de las relaciones de propiedad de objeto en el gráfico de objetos del objeto de negocio.

Puede enlazar a un valor de propiedad individual o puede enlazar a una propiedad de destino que contiene listas o colecciones. Si el origen es una colección o si la ruta de acceso especifica una propiedad de colección, el motor de enlace de datos coincide con los elementos de colección del origen con el destino de enlace, lo que da como resultado un comportamiento como rellenar un ListBox con una lista de elementos de una colección de orígenes de datos sin necesidad de prever los elementos específicos de esa colección.

Recorrido de un gráfico de objetos

El elemento de la sintaxis que denota el recorrido de una relación de propiedad de objeto en un gráfico de objetos es el carácter de punto (.). Cada punto en una cadena de ruta de una propiedad indica una división entre un objeto (a la izquierda del punto) y una propiedad de ese objeto (a la derecha del punto). La cadena se evalúa de izquierda a derecha, lo que permite recorrer varias relaciones de propiedad de objeto. Echemos un vistazo a un ejemplo:

"{Binding Path=Customer.Address.StreetAddress1}"

Esta es la forma en que se evalúa esta ruta de acceso:

  1. El objeto de contexto de datos (o un Origen especificado por el mismo Binding) se busca una propiedad llamada "Customer".
  2. El objeto que es el valor de la propiedad "Customer" se busca en una propiedad denominada "Address".
  3. El objeto que es el valor de la propiedad "Address" se busca en una propiedad denominada "StreetAddress1".

En cada uno de estos pasos, el valor se trata como un objeto . El tipo del resultado solo se comprueba cuando el enlace se aplica a una propiedad específica. En este ejemplo se produciría un error si "Address" fuera simplemente un valor de cadena que no expondría qué parte de la cadena era la dirección postal. Normalmente, la vinculación apunta a los valores de propiedad anidados específicos de un objeto de negocio que tiene una estructura de información conocida y bien definida.

Reglas para las propiedades en una ruta de enlace de datos

  • Todas las propiedades a las que hace referencia una ruta de acceso de propiedad deben ser públicas en el objeto de negocio de origen.
  • La propiedad final (la última propiedad nombrada en la ruta) debe ser pública y mutable; no se puede vincular a valores estáticos.
  • La propiedad end debe tener capacidad de lectura/escritura si esta ruta se utiliza como información de ruta para un enlace bidireccional.

Indexadores

Una ruta de propiedad para el enlace de datos puede incluir referencias a propiedades indexadas. Esto permite el enlace a listas o vectores ordenados, o a diccionarios o mapas. Use corchetes "[]" para indicar una propiedad indizada. El contenido de estos corchetes puede ser un entero (para la lista ordenada) o una cadena sin comillas (para diccionarios). También puede enlazar a un diccionario donde la clave es un entero. Puede usar diferentes propiedades indexadas en la misma ruta de acceso, con un punto que separa la propiedad del objeto.

Por ejemplo, considere un objeto de negocio donde hay una lista de "Equipos" (lista ordenada), cada uno de los cuales tiene un diccionario de "Jugadores" donde cada jugador está identificado por su apellido. Una ruta de acceso de propiedad de ejemplo a un jugador específico del segundo equipo es: "Equipos[1].Jugadores[Smith]". (Usas 1 para indicar el segundo elemento en "Teams" porque la lista está indexada desde cero).

Nota:

La compatibilidad con la indexación de fuentes de datos de C++ es limitada; consulte Vinculación de datos en profundidad.

Propiedades adjuntas

Las rutas de acceso de propiedades pueden incluir referencias a propiedades adjuntas. Dado que el nombre identificador de una propiedad adjunta ya incluye un punto, debe incluir cualquier nombre de propiedad adjunta entre paréntesis para que el punto no se trate como un paso de acceso a propiedades de objetos. Por ejemplo, la cadena para especificar que desea usar Canvas.ZIndex como ruta de acceso de enlace es "(Canvas.ZIndex)". Para obtener más información sobre las propiedades adjuntas, consulte Introducción a las propiedades adjuntas.

Combinación de la sintaxis de ruta de propiedad

Puede combinar varios elementos de la sintaxis de la ruta de propiedad en una cadena. Por ejemplo, puede definir una ruta de acceso de propiedad que haga referencia a una propiedad adjunta indizada, si el origen de datos tenía dicha propiedad.

Depuración de una ruta de acceso de propiedad vinculante

Dado que un motor de enlace de datos interpreta una ruta de acceso de propiedad y se basa en información que solamente puede estar presente durante el tiempo de ejecución, frecuentemente debe depurar una ruta de acceso de propiedad para el enlace sin la capacidad de apoyarse en el soporte convencional durante el diseño o la compilación en las herramientas del entorno de desarrollo. En muchos casos, el resultado en tiempo de ejecución de no resolver una ruta de propiedad es un valor vacío sin error, ya que es el comportamiento predeterminado por diseño de la resolución de enlace. Afortunadamente, Microsoft Visual Studio proporciona un modo de salida de depuración que puede aislar qué parte de una ruta de propiedad especifica una fuente de enlace que no se pudo resolver. Para obtener más información sobre el uso de esta característica de herramienta de desarrollo, consulte la sección "Depuración" del enlace de datos en profundidad.

Ruta de acceso de la propiedad para el objetivo de la animación

Las animaciones se basan en el destino de una propiedad de dependencia en la que se aplican valores de guion gráfico cuando se ejecuta la animación. Para identificar el objeto en el que existe la propiedad que se va a animar, la animación tiene como destino un elemento por nombre (atributo x:Name). A menudo es necesario definir una ruta de acceso de propiedad que comience con el objeto identificado como Storyboard.TargetName y termine con el valor de propiedad de dependencia concreto donde se debe aplicar la animación. Esa ruta de acceso de propiedad se usa como valor para Storyboard.TargetProperty.

Para obtener más información sobre cómo definir animaciones en XAML, consulta Animaciones con guion gráfico.

Selección de destino simple

Si estás animando una propiedad que existe en el propio objeto de destino, y ese tipo de propiedad puede tener una animación aplicada directamente a ella (en lugar de a una subpropiedad del valor de una propiedad), puedes simplemente nombrar la propiedad que se va a animar sin ninguna especificación adicional. Por ejemplo, si tiene como destino una subclase Shape como Rectangle y está aplicando un color animado a la propiedad Fill , la ruta de acceso de la propiedad puede ser "Fill".

Destino de propiedades indirectas

Puede animar una propiedad que sea una subpropiedad del objeto de destino. En otras palabras, si hay una propiedad del objeto de destino que es un objeto por sí mismo y ese objeto tiene propiedades, debe definir una ruta de propiedad que indique cómo navegar por esa relación de propiedad de objeto. Siempre que especifique un objeto en el que quiera animar una subpropiedad, incluya el nombre de propiedad entre paréntesis y especifique la propiedad en typename. formato propertyname . Por ejemplo, para especificar que desea el valor del objeto de la propiedad RenderTransform de un objeto de destino, debe especificar "(UIElement.RenderTransform)" como el primer paso en la ruta de la propiedad. Aún no es una ruta de acceso completa, ya que no hay animaciones que se puedan aplicar directamente a un valor Transform. Por lo tanto, en este ejemplo, ahora se completa la ruta de acceso de la propiedad para que la propiedad end sea una propiedad de una subclase Transform que se pueda animar mediante un valor Double: "(UIElement.RenderTransform).(CompositeTransform.TranslateX)"

Especificar un elemento hijo determinado en una colección

Para especificar un elemento secundario en una propiedad de colección, puede usar un indexador numérico. Use caracteres "[]" entre corchetes alrededor del valor de índice entero. Solo puede hacer referencia a listas ordenadas, no diccionarios. Dado que una colección no es un valor que se pueda animar, el uso de un indexador nunca puede ser la propiedad final de una ruta de acceso de propiedad.

Por ejemplo, para especificar que desea animar el color del primer punto de detención en un LinearGradientBrush que se aplica a la propiedad Background de un control, esta es la ruta de acceso de la propiedad: "(Control.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)". Observe cómo el indexador no es el último paso de la ruta de acceso y que el último paso debe hacer referencia especialmente a la propiedad GradientStop.Color del elemento 0 de la colección para aplicar un valor animado Color a ella.

Animar una propiedad adjunta

No es un escenario común, pero es posible animar una propiedad adjunta, siempre que esa propiedad adjunta tenga un valor de propiedad que coincida con un tipo de animación. Dado que el nombre identificador de una propiedad adjunta ya incluye un punto, debe incluir cualquier nombre de propiedad adjunta entre paréntesis para que el punto no se trate como un paso de acceso a propiedades de objetos. Por ejemplo, la cadena para especificar que desea animar la propiedad adjunta Grid.Row en un objeto, use la ruta de acceso de la propiedad "(Grid.Row)".

Nota:

En este ejemplo, el valor de Grid.Row es un tipo de propiedad Int32 . por lo tanto, no puedes animarlo con una animación Double. En su lugar, definiría un ObjectAnimationUsingKeyFrames que tiene componentesDiscreteObjectKeyFrame , donde ObjectKeyFrame.Value se establece en un entero como "0" o "1".

Reglas para las propiedades en una ruta de propiedad de animación de destino

  • El punto inicial asumido de la ruta de acceso de la propiedad es el objeto identificado por Storyboard.TargetName.
  • Todos los objetos y propiedades a los que se hace referencia a lo largo de la ruta de acceso de la propiedad deben ser públicos.
  • La propiedad end (la propiedad que es la última propiedad nombrada en la ruta de acceso) debe ser pública, ser de lectura y escritura y ser una propiedad dependiente.
  • La propiedad end debe tener un tipo de propiedad que sea capaz de animarse por una de las amplias clases de tipos de animación (animaciones de color , animaciones dobles , animaciones de punto , ObjectAnimationUsingKeyFrames).

La clase PropertyPath

La clase PropertyPath es el tipo de propiedad subyacente de Binding.Path para el escenario de enlace.

La mayoría de las veces, puedes aplicar un PropertyPath en XAML sin usar ningún código en absoluto. Sin embargo, en algunos casos es posible que desee definir un objeto PropertyPath mediante código y asignarlo a una propiedad en tiempo de ejecución.

PropertyPath tiene un constructor PropertyPath(String) y no tiene un constructor predeterminado. La cadena que se pasa a este constructor es una cadena que se define mediante la sintaxis de la ruta de acceso de propiedad, como se explicó anteriormente. También es la misma cadena que usarías para asignar Path como atributo XAML. La única API de la clase PropertyPath es la propiedad Path , que es de solo lectura. Puede usar esta propiedad como cadena de construcción para otra instancia de PropertyPath .