Resumo de Declaração de Associações

Esse tópico discute as diferentes maneiras que você pode declarar uma associação.

Este tópico contém as seguintes seções.

  • Pré-requisitos
  • Declarando uma associação no XAML
  • Criando uma Associação no Código
  • Sintaxe de Caminho de Associação
  • Comportamentos Padrão
  • Tópicos relacionados

Pré-requisitos

Antes de ler este tópico, é importante que você esteja familiarizado com o conceito e uso de extensões de marcação. Para obter mais informações sobre extenções de marcação, consulte Extensão de Marcação e XAML.

Este tópico não cobre os conceitos de associação de dados. Para uma discussão sobre conceitos de associação de dados, consulte Revisão de Associação de Dados

Declarando uma associação no XAML

Esse tópico discute como declarar uma associação em Extensible Application Markup Language (XAML).

Usos de Extensão de Marcação

Binding é uma extensão de marcação. Quando você usa uma extensão de associação para declarar uma associação, a declaração consiste de uma série de clausulas depois da palavra-chave Binding e separados por vírgulas (,). As cláusulas de declaração de associação podem estar em qualquer ordem e existem várias combinações possíveis. As cláusulas são pares Nome=Valor onde Nome é o nome da propriedade Binding e Valor é o valor que você está atribuindo a esta propriedade.

Quando criar strings de declaração de associação em marcação, elas devem ser anexadas à propriedade de dependência de um objeto alvo. O seguinte exemplo mostra como associar a propriedade TextBox.Text usando a extensão de associação, especificando as propriedades Source, Path, e UpdateSourceTrigger.

<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=PersonName}"/>

Você pode especificar a maioria das propriedades da classe Binding desta maneira. Para mais informações sobre as extensões de associação, assim como uma lista de propriedades Binding que não podem ser modificadas usando as extensões de associação, consulte o resumo Ligação de marcação de extensão.

Sintaxe de Elemento de Objeto

Sintaxe de elemento de objeto é uma alternativa para a criação de declarações de associação. Na maioria dos casos, não há vantagens particulares entre usar tanto a extensão de marcação quanto a sintaxe de elemento de objeto. Entretanto, nos casos em que a extensão de marcação não suporta seu cenário, tal quando seu valor da propriedade é do tipo não string para o qual não existe conversão de tipos, você precisa usar a sintaxe de elemento de objeto.

O seguinte é um exemplo de uso da sintaxe de elemento de objeto e da extensão de marcação:

<TextBlock Name="myconvertedtext"
  Foreground="{Binding Path=TheDate,
                       Converter={StaticResource MyConverterReference}}">
  <TextBlock.Text>
    <Binding Path="TheDate"
             Converter="{StaticResource MyConverterReference}"/>
  </TextBlock.Text>
</TextBlock>

O exemplo associa a propriedade Foreground declarando a associação usando a sintaxe de extensão. A declaração de associação para a propriedade Text usa a sintaxe de elemento de objeto.

Para obter mais informações sobre diferentes termos, consulte Terminologia de sintaxe XAML.

Associação Múltipla e Associação de Prioridade.

MultiBinding e PriorityBinding não suportam a extensão de sintaxe XAML. Portanto, você deve usar a sintaxe de elemento de objeto se você está declarando a MultiBinding ou a PriorityBinding em XAML.

Criando uma Associação no Código

Outra maneira de especificar uma associação é atribuir a propriedade diretamente num objeto Binding no código. O seguinte exemplo mostra como criar um objeto Binding e especificar as propriedades no código:

    private void OnPageLoaded(object sender, EventArgs e)
    {
        // Make a new source, to grab a new timestamp
        MyData myChangedData = new MyData();

        // Create a new binding
    // TheDate is a property of type DateTime on MyData class
        Binding myNewBindDef = new Binding("TheDate");

        myNewBindDef.Mode = BindingMode.OneWay;
        myNewBindDef.Source = myChangedData;
        myNewBindDef.Converter = TheConverter;
        myNewBindDef.ConverterCulture = new CultureInfo("en-US");

    // myDatetext is a TextBlock object that is the binding target object
        BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef);
        BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef);



...


}

Se o objeto que você está associando é um FrameworkElement ou um FrameworkContentElement você pode chamar o método SetBinding em seu objeto diretamente ao invés de usar BindingOperations.SetBinding. Para um exemplo, consulte Como: Criar uma associação em código.

Sintaxe de Caminho de Associação

Use a propriedade Path para especificar a fonte de um valor que você quer associar a:

  • No caso mais simples, o valor da propriedade Path é o nome da propriedade do objeto fonte a ser usado na associação, como em Path=PropertyName.

  • Subpropriedades de uma propriedade pode ser espenicada por uma sintaxe similar como em C#. Por exemplo, a cláusula Path=ShoppingCart.Order atribui a associação a subpropriedade Order do objeto ou da propriedade ShoppingCart.

  • Para associar uma propriedade anexa, coloque parenteses em volta da propriedade anexa. Por exemplo, para associar a propriedade anexa DockPanel.Dock, a sintaxe é Path=(DockPanel.Dock).

  • Indexadores de uma propriedade podem ser especificados dentro de colchetes após o nome da propriedade onde o indexador é aplicado. Por exemplo, a cláusula Path=ShoppingCart[0] atribui a associação ao índice que corresponde a como a sua a indexação interna de sua propriedade lida com a string literal "0". Indexadores aninhados também são suportados.

  • Indexadores e subpropriedades podem ser misturados em cláusulas Path; por exemplo, Path=ShoppingCart.ShippingInfo[MailingAddress,Street].

  • Dentro de indexadores você pode ter múltiplos parâmetros de indexador separados por vírgula (,). O tipo de cara parâmetro pode ser especificado com parênteses. Por exemplo, você pode Path="[(sys:Int32)42,(sys:Int32)24]", onde sys é mapeado ao namespace System.

  • Quando a fonte é um modo de exibição de coleção, o item corrente pode ser especificado com uma barra / (/). Por exemplo, a cláusula Path=/ Define a ligação para o item corrente no modo de exibição. Quando a fonte é uma coleção, esta sintaxe Especifica o item corrente da exibição de coleção padrão.

  • Nomes de propriedades e barras podem ser combinadas para atravessar propriedades que são coleções. Por exemplo, Path=/Offices/ManagerName Especifica o item corrente da coleção de fonte que contém um Offices propriedade que também é uma coleção. O item corrente é um objeto que contém um ManagerName propriedade.

  • Opcionalmente, um caminho de ponto (.) pode ser usado para BIND a fonte corrente. Por exemplo, Text=”{Binding}” é equivalente a Text=”{Binding Path=.}”.

Mecanismo de Escape

  • Dentro dos indexadores ([ ]), o acento circunflexo (^) pula o próximo caractere.

  • Se você atribui um Caminho em XAML, você também precisa pular (usando entidades XML) certos caracteres que são especiais para o parseador XML:

    • Use &amp; para pular o caractere "&".

    • Use &gt; para pular a marca de fim "&".

  • Adicionalmente, se você descreve a associação inteira em um atributo usando a sintaxe de extensão de marcação, você precisa pular (usando a barra invertida \) caracteres que são especiais para o parseador de extensão de marcação WPF:

    • Barra invertida é um caractere de pulo por si só.

    • O sinal de igual (=) separa o nome da propriedade do valor da propriedade.

    • Vírgula (,) separa propriedades.

    • O fecha chaves (}) é o final da marcação de extensão.

Comportamentos Padrão

O comportamento padrão é como o que segue, se não especificado na declaração.

  • Um conversor padrão que tenta realizar a conversão de tipos entre o valor da fonte da associação e o valor do destino da associação é criado. Se a conversão não pode ser realizada, o conversor padrão retorna null.

  • Se você não especificar ConverterCulture, o motor de associação usa a propriedade Language do objeto da associação destino. Em XAMLo padrão é "en-US" ou herda o valor do elemento raiz (ou qualquer elemento) da página, se um for explicitamente especificado.

  • Contanto que a ligação já tem um contexto de dados (por exemplo, o contexto dados herdados provenientes de um elemento pai) e qualquer item ou a coleção que está sendo retornado por esse contexto não é apropriada para ligação sem a necessidade de ainda mais a modificação de caminho, uma declaração de ligação pode ter nenhum cláusulas em todos sistema autônomo: {Binding} Isso geralmente é a maneira de que uma ligação é especificada para estilo de dados, onde a ligação age sobre uma coleção. Para obter mais informações, consulte os Objetos Completos Usados como na seção Fonte de Associação em Visão geral sobre associação de fontes.

  • O padrão Mode vária entre unidirecional e bidirecional, dependendo da propriedade de dependência que está sendo associada. Você sempre pode declarar o modo de associação explicitamente para garantir que sua associação tenha o comportamento desejado. No geral, propriedades de controle editáveis pelo usuário, tais como TextBox.Text e RangeBase.Value são associações bidirecionais por padrão, quando que o padrão da maioria de outras propriedades é associação unidirecional.

  • O valor padrão UpdateSourceTrigger varia entre PropertyChanged e LostFocus dependendo da da propriedade de dependência associada. O valor da maioria das propriedades de dependência é PropertyChanged, enquanto a propriedade TextBox.Text tem o valor padrão de LostFocus.

Consulte também

Conceitos

Revisão de Associação de Dados

Otimizando o desempenho: Ligação de Dados

Outros recursos

Data Binding How-to Topics