Compartilhar via


Sintaxe de Property-path

Você pode usar a classe PropertyPath e a sintaxe de cadeia de caracteres para criar uma instância de um valor PropertyPath no XAML ou no código. Os valores do PropertyPath são usados pela associação de dados. Uma sintaxe semelhante é usada para direcionar animações com storyboard. Para ambos os cenários, um caminho de propriedade descreve um percurso entre uma ou mais relações objeto-propriedade que acabam por resolver em uma única propriedade.

Você pode definir um caminho de propriedade diretamente em um atributo no XAML. Você pode usar a mesma sintaxe de cadeia de caracteres para construir um PropertyPath que define uma associação no código ou definir um destino de animação no código usando SetTargetProperty. Há duas áreas de recursos distintas no Windows Runtime que usam um caminho de propriedade: associação de dados e direcionamento de animação. O direcionamento de animação não cria valores de sintaxe do "Property-path" subjacentes na implementação do Windows Runtime, mantém as informações como string, mas os conceitos de travesia de propriedade de objeto são muito semelhantes. A associação de dados e a animação avaliam um caminho de propriedade de maneiras ligeiramente diferentes, por isso descrevemos a sintaxe desse caminho separadamente para cada um.

Caminho da propriedade para objetos na associação de dados

No Windows Runtime, você pode vincular-se ao valor alvo de qualquer propriedade de dependência. O valor da propriedade de origem de uma associação de dados não precisa ser uma propriedade de dependência; pode ser uma propriedade em um objeto de negócios (por exemplo, uma classe escrita em uma linguagem Microsoft .NET ou C++). Ou o objeto de origem do valor de associação pode ser um objeto de dependência existente já definido pelo aplicativo. A origem pode ser referenciada por um nome de propriedade simples ou por uma navegação das relações objeto-propriedade no grafo de objetos do objeto de negócios.

Você pode vincular a um valor de propriedade individual ou vincular a uma propriedade de destino que contém listas ou coleções. Se sua origem for uma coleção ou se o caminho especificar uma propriedade de coleção, o mecanismo de associação de dados corresponderá os itens de coleção da origem ao destino de associação, resultando em um comportamento como preencher um ListBox com uma lista de itens de uma coleção de fontes de dados sem a necessidade de prever os itens específicos nessa coleção.

Percorrendo um grafo de objetos

O elemento da sintaxe que indica a passagem de uma relação objeto-propriedade em um grafo de objeto é o caractere dot (.). Cada ponto em uma cadeia de caracteres de caminho de propriedade indica uma divisão entre um objeto (lado esquerdo do ponto) e uma propriedade desse objeto (lado direito do ponto). A cadeia de caracteres é avaliada da esquerda para a direita, o que permite percorrer várias relações de propriedade de objeto. Vamos examinar um exemplo:

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

Veja como esse caminho é avaliado:

  1. O objeto de contexto de dados (ou uma fonte especificada pela mesma vinculação) é pesquisado por uma propriedade chamada "Customer".
  2. O objeto que é o valor da propriedade "Customer" é pesquisado por uma propriedade chamada "Address".
  3. O objeto que é o valor da propriedade "Address" é usado como referência para buscar uma propriedade chamada "StreetAddress1".

Em cada uma dessas etapas, o valor é tratado como um objeto. O tipo do resultado é verificado somente quando a associação é aplicada a uma propriedade específica. Este exemplo falharia se "Address" fosse apenas um valor de cadeia de caracteres que não exponha qual parte da cadeia de caracteres era o endereço de rua. Normalmente, a vinculação aponta para os valores específicos de propriedades aninhadas de um objeto de negócios com uma estrutura de informações conhecida e deliberada.

Regras para as propriedades em um caminho de propriedade de associação de dados

  • Todas as propriedades referenciadas por um caminho de propriedade devem ser públicas no objeto de negócios de origem.
  • A propriedade final (a propriedade que é a última propriedade nomeada no caminho) deve ser pública e deve ser mutável – você não pode associar a valores estáticos.
  • A propriedade final deverá ser de leitura/gravação se esse caminho for usado como informações de caminho para uma associação bidirecional.

Indexadores

Um caminho de propriedade para associação de dados pode incluir referências a propriedades indexadas. Isso permite a associação a listas/vetores ordenados ou a dicionários/mapas. Use os caracteres "[]" de colchetes para indicar uma propriedade indexada. O conteúdo desses colchetes pode ser um inteiro (para lista sequencialmente ordenada) ou uma string não citada (para dicionários). Você também pode associar a um dicionário em que a chave é um inteiro. Você pode usar propriedades indexadas diferentes no mesmo caminho com um ponto separando a propriedade do objeto.

Por exemplo, considere um objeto de negócios em que há uma lista de "Teams" (lista ordenada), cada um deles tem um dicionário de "Players" em que cada jogador é chaveado pelo sobrenome. Um exemplo de caminho de propriedade para um jogador específico no segundo time é: "Teams[1].Players[Smith]". (Você usa 1 para indicar o segundo item no "Teams" porque a lista é indexada a partir de zero.)

Observação

O suporte de indexação para fontes de dados do C++ é limitado; consulte a associação de dados detalhadamente.

Propriedades anexadas

Os caminhos de propriedade podem incluir referências a propriedades vinculadas. Como o nome de identificação de uma propriedade anexada já inclui um ponto, você deve colocar qualquer nome de propriedade anexada entre parênteses para que o ponto não seja tratado como uma etapa de propriedade de objeto. Por exemplo, a cadeia de caracteres a especificar que você deseja usar Canvas.ZIndex como um caminho de associação é "(Canvas.ZIndex)". Para obter mais informações sobre propriedades anexadas, consulte a visão geral das propriedades anexadas.

Combinando a sintaxe do caminho de propriedade

Você pode combinar vários elementos da sintaxe de caminho de propriedade em uma única cadeia de caracteres. Por exemplo, você pode definir um caminho de propriedade que faça referência a uma propriedade anexada indexada se a fonte de dados tiver essa propriedade.

Depurando um caminho de propriedade de associação

Como um caminho de propriedade é interpretado por um mecanismo de associação e se baseia em informações que podem estar presentes apenas em tempo de execução, muitas vezes você deve depurar um caminho de propriedade para associação sem poder contar com o suporte convencional de tempo de design ou de tempo de compilação nas ferramentas de desenvolvimento. Em muitos casos, o resultado em tempo de execução de não resolver o caminho de uma propriedade é um valor em branco sem erro, pois esse é o comportamento de fallback projetado da resolução de vinculação. Felizmente, o Microsoft Visual Studio fornece um modo de saída de depuração que pode isolar qual parte de um caminho de propriedade que está especificando uma fonte de associação não foi resolvida. Para obter mais informações sobre como usar esse recurso de ferramenta de desenvolvimento, consulte a seção "Depuração" da associação de dados em profundidade.

Caminho da propriedade para direcionamento de animação

As animações dependem do direcionamento de uma propriedade de dependência em que os valores de storyboard são aplicados quando a animação é executada. Para identificar o objeto em que a propriedade a ser animada existe, a animação tem como destino um elemento por nome (atributo x:Name). Geralmente, é necessário definir um caminho de propriedade que começa com o objeto identificado como Storyboard.TargetName e termina com o valor de propriedade de dependência específico em que a animação deve ser aplicada. Esse caminho de propriedade é usado como o valor de Storyboard.TargetProperty.

Para obter mais informações sobre como definir animações em XAML, consulte animações com storyboard.

Direcionamento simples

Se você estiver animando uma propriedade que existe no próprio objeto de destino e o tipo dessa propriedade pode ter uma animação aplicada diretamente a ela (em vez de a uma sub-propriedade do valor de uma propriedade), você pode simplesmente nomear a propriedade que está sendo animada sem qualquer qualificação adicional. Por exemplo, se você estiver alvejando uma subclasse Shape, como Retângulo, e estiver aplicando uma cor animada à propriedade Fill, seu caminho da propriedade poderá ser "Fill".

Direcionamento de propriedade indireta

Você pode animar uma propriedade que é uma sub-propriedade do objeto de destino. Em outras palavras, se houver uma propriedade do objeto de destino que seja um objeto em si e esse objeto tiver propriedades, você deverá definir um caminho de propriedade que explique como percorrer essa relação objeto-propriedade. Sempre que você estiver especificando um objeto em que deseja animar uma sub-propriedade, coloque o nome da propriedade entre parênteses e especifique a propriedade em typename. formato propertyname . Por exemplo, para especificar que você deseja o valor do objeto da propriedade RenderTransform de um objeto de destino, especifique "(UIElement.RenderTransform)" como a primeira etapa no caminho da propriedade. Este ainda não é um caminho completo, pois não há animações que possam ser aplicadas diretamente a um valor de Transformação . Portanto, para este exemplo, agora você conclui o caminho da propriedade para que a propriedade final seja uma propriedade de uma subclasse Transform que pode ser animada por um valor Double: "(UIElement.RenderTransform).(CompositeTransform.TranslateX)"

Especificando um filho específico em uma coleção

Para especificar um subitem em uma propriedade de coleção, você pode usar um indexador numérico. Use os caracteres "[]" entre colchetes ao redor do valor do índice inteiro. Você pode referenciar apenas listas ordenadas, não dicionários. Como uma coleção não é um valor que pode ser animado, o uso de um indexador nunca pode ser a propriedade final em um caminho de propriedade.

Por exemplo, para especificar que você deseja animar a primeira parada de cor em um LinearGradientBrush aplicado à propriedade Background de um controle, este é o caminho da propriedade: "(Control.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)". Observe como o indexador não é a última etapa no caminho e que a última etapa deve referenciar particularmente a propriedade GradientStop.Color do item 0 na coleção para aplicar um valor animado color a ele.

Animando uma propriedade anexada

Não é um cenário comum, mas é possível animar uma propriedade anexada, desde que essa propriedade anexada tenha um valor de propriedade que corresponda a um tipo de animação. Como o nome de identificação de uma propriedade anexada já inclui um ponto, você deve colocar qualquer nome de propriedade anexada entre parênteses para que o ponto não seja tratado como uma etapa de propriedade de objeto. Por exemplo, a cadeia de caracteres para especificar que você deseja animar a propriedade anexada Grid.Row em um objeto, use o caminho de propriedade "(Grid.Row)".

Observação

Para este exemplo, o valor de Grid.Row é um tipo de propriedade Int32 . não é possível animá-lo com uma animação Double. Em vez disso, você definiria um ObjectAnimationUsingKeyFrames que tenha componentes DiscreteObjectKeyFrame , em que o ObjectKeyFrame.Value é definido como um inteiro, como "0" ou "1".

Regras para as propriedades em um caminho de destino da propriedade na animação

  • O ponto inicial assumido do caminho da propriedade é o objeto identificado por um Storyboard.TargetName.
  • Todos os objetos e propriedades referenciados ao longo do caminho da propriedade devem ser públicos.
  • A propriedade final (a propriedade que é a última propriedade nomeada no caminho) deve ser pública, ser de leitura e escrita, e ser uma propriedade de dependência.
  • A propriedade final deve ter um tipo que possa ser animada por uma das amplas classes de tipos de animação (animações de Color, animações Double, animações Point, ObjectAnimationUsingKeyFrames).

A classe PropertyPath

A classe PropertyPath é o tipo de propriedade subjacente de Binding.Path para o cenário de associação.

Na maioria das vezes, você pode aplicar um PropertyPath em XAML sem usar nenhum código. Mas, em alguns casos, talvez você queira definir um objeto PropertyPath usando código e atribuí-lo a uma propriedade em tempo de execução.

PropertyPath tem um construtor PropertyPath(String) e não tem um construtor padrão. A cadeia de caracteres que você passa para esse construtor é uma cadeia de caracteres definida usando a sintaxe do caminho da propriedade, como explicamos anteriormente. Essa também é a mesma cadeia de caracteres que você usaria para atribuir o Caminho como um atributo XAML. A única outra API da classe PropertyPath é a propriedade Path , que é somente leitura. Você pode usar essa propriedade como a string de construção para outra instância de PropertyPath.