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 de una o varias relaciones de propiedad de objeto que finalmente se resuelven en una sola propiedad.

Puedes establecer una cadena de ruta de acceso 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: enlace de datos y 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 propiedad de objeto son muy similares. El enlace de datos y la animación que tienen como destino cada una evalúan una ruta de acceso de propiedad ligeramente diferente, por lo que se describe la sintaxis de ruta de acceso de propiedad por separado para cada una.

Ruta de acceso de propiedad para objetos en el enlace 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 de una cadena de ruta de acceso de propiedad indica una división entre un objeto (lado izquierdo del punto) y una propiedad de ese objeto (lado derecho del punto). La cadena se evalúa de izquierda a derecha, lo que permite recorrer varias relaciones de propiedad de objeto. Veamos 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 enlace) se busca en una propiedad denominada "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, el enlace apunta a los valores de propiedad anidados específicos de un objeto de negocio que tiene una estructura de información conocida y deliberada.

Reglas para las propiedades de una ruta de acceso de propiedad 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 end (la propiedad que es la última propiedad con nombre de la ruta de acceso) debe ser pública y debe ser mutable: no se puede enlazar a valores estáticos.
  • La propiedad end debe ser de lectura y escritura si esta ruta de acceso se usa como información de ruta de acceso para un enlace bidireccional.

Indizadores

Una ruta de acceso de propiedad para el enlace de datos puede incluir referencias a propiedades indizada. 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 indizadas en la misma ruta de acceso con un punto que separa la propiedad de objeto.

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

Nota La compatibilidad con la indexación de orígenes de datos de C++ es limitada; consulte Enlace de datos en profundidad.

Propiedades adjuntas

Las rutas de acceso de propiedades pueden incluir referencias a propiedades adjuntas. Dado que el nombre de identificación 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 propiedad de objeto. 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 acceso de propiedad

Puede combinar varios elementos de la sintaxis de ruta de acceso 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 acceso de propiedad de enlace

Dado que un motor de enlace interpreta una ruta de acceso de propiedad y se basa en información que solo puede estar presente en tiempo de ejecución, a menudo debe depurar una ruta de acceso de propiedad para el enlace sin poder confiar en la compatibilidad convencional en tiempo de diseño o en tiempo de compilación en las herramientas de desarrollo. En muchos casos, el resultado en tiempo de ejecución de no resolver una ruta de acceso de propiedad es un valor en blanco sin error, ya que es el comportamiento de reserva 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 acceso de propiedad que especifica un origen de enlace 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 la segmentación de 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 subpropiación del valor de una propiedad), puedes simplemente asignar un nombre a la propiedad que se va a animar sin ninguna calificació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 subpropiación del objeto de destino. En otras palabras, si hay una propiedad del objeto de destino que es un propio objeto y ese objeto tiene propiedades, debe definir una ruta de acceso de propiedad que explique cómo recorrer paso a paso 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, especifique "(UIElement.RenderTransform)" como primer paso de la ruta de acceso 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 de transformación . 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 secundario 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 puede animar, un uso del indexador nunca puede ser la propiedad final de una ruta de acceso de propiedad.

Por ejemplo, para especificar que desea animar el primer color de detención de color 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 de identificación 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 propiedad de objeto. 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 que no puedes animarlo con una animación Double . En su lugar, definiría un ObjectAnimationUsingKeyFrames que tiene componentes DiscreteObjectKeyFrame, donde ObjectKeyFrame.Value se establece en un entero como "0" o "1".

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

  • 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 con nombre de la ruta de acceso) debe ser pública, ser de lectura y escritura y ser 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 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 .