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 de PropertyPath se utilizan en el enlace de datos. Se usa una sintaxis similar para dirigirse a animaciones con guion gráfico. En ambos casos, una ruta de propiedad describe un recorrido por una o varias relaciones entre objetos y propiedades que, en última instancia, se resuelven en una única propiedad.

Puedes establecer una cadena de ruta de propiedad directamente en un atributo de 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 funcionalidad distintas en Windows Runtime que utilizan una ruta de propiedad: el enlace de datos y la orientación de animaciones. La orientación de animaciones no crea valores sintácticos de ruta de propiedad subyacentes en la implementación de Windows Runtime, sino que mantiene la información como una cadena, pero los conceptos de recorrido de objeto-propiedad son muy similares. El enlace de datos y la orientación de animaciones evalúan la ruta de propiedad de forma ligeramente diferente, por lo que describimos la sintaxis de la ruta 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.

Se puede realizar un enlace a un valor de propiedad individual o a una propiedad de destino que contenga 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 grafo 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. Se busca en el objeto de contexto de datos (o en una Fuente especificada por el mismo Enlace) una propiedad denominada Customer.
  2. En el objeto que es el valor de la propiedad Customer se busca una propiedad denominada Address.
  3. Se busca en el objeto que constituye el valor de la propiedad Address 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 final debe ser de lectura/escritura si esta ruta se utiliza como información Path 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. Puedes utilizar diferentes propiedades indexadas en la misma ruta, separando el objeto y la propiedad con un punto.

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. Un ejemplo de ruta de propiedad para un jugador específico del segundo equipo es: Teams[1].Players[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 identificativo de una propiedad adjunta ya incluye un punto, debes escribir cualquier nombre de propiedad adjunta entre paréntesis para que el punto no se interprete como un paso objeto-propiedad. 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 la ruta de propiedad

Puedes combinar varios elementos de la sintaxis de la ruta de propiedad en una sola 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 propiedad de enlace

Dado que una ruta de propiedad es interpretada por un motor de enlace y se basa en información que puede estar presente únicamente en tiempo de ejecución, a menudo es necesario depurar una ruta de propiedad para el enlace sin poder contar con el soporte convencional en tiempo de diseño o de compilación de las herramientas de desarrollo. En muchos casos, el resultado en tiempo de ejecución de no poder resolver una ruta de propiedad es un valor en blanco sin error, ya que ese es el comportamiento de reserva por diseño de la resolución de enlaces. Afortunadamente, Microsoft Visual Studio proporciona un modo de salida de depuración que permite aislar qué parte de una ruta de propiedad que especifica una fuente de enlace no se ha podido resolver. Para obtener más información sobre el uso de esta característica de la herramienta de desarrollo, consulta la sección Depuración de Enlace de datos en profundidad.

Ruta de la propiedad para la selección de objetivos de animación

Las animaciones se basan en la selección de una propiedad de dependencia a la que se aplican los valores del storyboard 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 sencilla

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 seleccionas una subclase de Shape como Rectangle y aplicas un Color animado a la propiedad Fill, la ruta de la propiedad puede ser Fill.

Selección indirecta de propiedades

Puedes animar una propiedad que sea una subpropiedad del objeto de destino. En otras palabras, si hay una propiedad del objeto de destino que es en sí misma un objeto, y ese objeto tiene propiedades, debes definir una ruta de propiedad que explique cómo recorrer esa relación objeto-propiedad. 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. Esta ruta aún no está completa, ya que no hay animaciones que puedan aplicarse directamente a un valor Transform. Por lo tanto, para este ejemplo, debes completar ahora la ruta de la propiedad de modo que la propiedad final sea una propiedad de una subclase de Transform que pueda animarse mediante un valor Double: (UIElement.RenderTransform). (CompositeTransform.TranslateX)

Especificar un elemento secundario concreto 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 en una ruta de propiedades.

Por ejemplo, para especificar que quieres animar el color del primer punto de color de un LinearGradientBrush aplicado a la propiedad Background de un control, la ruta de la propiedad es la siguiente: (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 identificativo de una propiedad adjunta ya incluye un punto, debes escribir cualquier nombre de propiedad adjunta entre paréntesis para que el punto no se interprete como un paso objeto-propiedad. Por ejemplo, la cadena para especificar que se desea animar la propiedad adjunta Grid.Row de un objeto es la ruta de 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 destino de animación

  • Se supone que el punto de partida de la ruta de propiedad es el objeto identificado por un 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 final (la última propiedad nombrada en la ruta) debe ser pública, de lectura y escritura, y una propiedad de dependencia.
  • 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 compilador es una cadena definida mediante la sintaxis de la ruta de propiedad, tal y como se ha explicado 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 .