Visão geral das origens da associação

Na associação de dados, o objeto de origem da associação refere-se ao objeto do qual você obtém dados. Este tópico discute os tipos de objetos que você pode usar como a origem da associação.

Tipos de origem da associação

A associação de dados do Windows Presentation Foundation (WPF) oferece suporte aos seguintes tipos de origem de vinculação:

Origem da associação Descrição
objetos CLR (Common Language Runtime) Você pode vincular a propriedades públicas, subpropriedades, bem como indexadores, de qualquer objeto CLR (Common Language Runtime). O mecanismo de vinculação usa a reflexão CLR para obter os valores das propriedades. Como alternativa, os objetos que implementam ICustomTypeDescriptor ou têm um registro TypeDescriptionProvider também funcionam com o mecanismo de vinculação.

Para obter mais informações sobre como implementar uma classe que pode servir como uma origem da associação, consulte Implementando uma classe para a origem da associação mais adiante neste tópico.
objetos dinâmicos Você pode vincular a propriedades e indexadores disponíveis de um objeto que implementa a IDynamicMetaObjectProvider interface. Se você pode acessar o membro no código, pode associar a ele. Por exemplo, se um objeto dinâmico permite que você acesse um membro no código por meio de someObject.AProperty, você pode associar a ele, definindo o caminho de associação como AProperty.
ADO.NET objetos Você pode vincular a objetos ADO.NET, como DataTable. O ADO.NET DataView implementa a IBindingList interface, que fornece notificações de alteração que o mecanismo de vinculação escuta.
Objetos XML Você pode vincular e executar XPath consultas em um XmlNode, XmlDocumentou XmlElement. Uma maneira conveniente de acessar dados XML que são a fonte de vinculação na marcação é usar um XmlDataProvider objeto. Para obter mais informações, consulte Associar a dados XML usando um XMLDataProvider e consultas XPath.

Você também pode vincular a um XElement ou , ou XDocumentvincular aos resultados de consultas executadas em objetos desses tipos usando LINQ to XML. Uma maneira conveniente de usar o LINQ to XML para acessar dados XML que são a fonte de vinculação na marcação é usar um ObjectDataProvider objeto. Para obter mais informações, consulte Associar a XDocument, XElement ou LINQ para resultados de Consulta XML.
Objetos DependencyObject Você pode vincular a propriedades de dependência de qualquer DependencyObjectarquivo . Para obter um exemplo, consulte Associar as propriedades de dois controles.

Implementando uma classe para a origem da associação

Você pode criar suas próprias origens da associação. Esta seção aborda as coisas que você precisa saber caso esteja implementando uma classe para servir como uma origem da associação.

Fornecendo notificações de alteração

Se você estiver usando uma ou TwoWay vinculação OneWay (porque deseja que sua interface do usuário seja atualizada quando as propriedades de origem da vinculação forem alteradas dinamicamente), deverá implementar um mecanismo de notificação de alteração de propriedade adequado. O mecanismo recomendado é que o CLR ou a classe dinâmica implemente a INotifyPropertyChanged interface. Para obter mais informações, consulte Implementar notificação de alteração da propriedade.

Se você criar um objeto CLR que não implemente INotifyPropertyChangedo , deverá organizar seu próprio sistema de notificação para garantir que os dados usados em uma associação permaneçam atualizados. Você pode fornecer notificações de alteração, oferecendo suporte ao padrão PropertyChanged para cada propriedade que você deseja receber notificações de alteração. Para dar suporte a esse padrão, você define um evento PropertyNameChanged para cada propriedade, em que PropertyName é o nome da propriedade. Você aciona o evento sempre que a propriedade é alterada.

Se a sua origem da associação implementa um desses mecanismos de notificação, as atualizações de destino ocorrem automaticamente. Se, por qualquer motivo, sua origem de vinculação não fornecer as notificações de alteração de propriedade apropriadas, você terá a opção de usar o UpdateTarget método para atualizar a propriedade de destino explicitamente.

Outras características

A lista a seguir fornece outros pontos importantes a serem observados:

  • Se você deseja criar o objeto em XAML, a classe deve ter um construtor sem parâmetro. Em algumas linguagens .NET, como C#, o construtor sem parâmetros pode ser criado para você.

  • As propriedades que você usa como propriedades de origem da associação para uma associação devem ser propriedades públicas da sua classe. As propriedades de interface definidas explicitamente não podem ser acessadas para fins de associação, nem podem ser propriedades protegidas, particulares, internas ou virtuais que não têm implementação de base.

  • Não é possível associar a campos públicos.

  • O tipo da propriedade declarado na sua classe é o tipo que é passado para a associação. No entanto, o tipo usado pela associação depende, em última análise, do tipo da propriedade de destino da associação e não da propriedade da origem da associação. Caso haja uma diferença de tipo, talvez você queira escrever um conversor para manipular como a propriedade personalizada será inicialmente passada para a associação. Para obter mais informações, consulte IValueConverter.

Usando objetos inteiros como uma origem da associação

Você pode usar um objeto inteiro como uma origem da associação. Você pode especificar uma fonte de vinculação usando a propriedade ou a SourceDataContext e, em seguida, fornecer uma declaração de vinculação em branco: {Binding}. Os cenários em que isso é útil incluem a associação a objetos que são do tipo cadeia de caracteres, associação a objetos com várias propriedades nas quais você está interessado ou associação a objetos de coleção. Para obter um exemplo de associação a um objeto de coleção inteira, consulte Usar o padrão de detalhes mestre com os dados hierárquicos.

Observe que talvez seja necessário aplicar uma lógica personalizada para que os dados sejam significativos para a propriedade de destino associada. A lógica personalizada pode estar na forma de um conversor personalizado (se a conversão de tipo padrão não existir) ou um DataTemplatearquivo . Para obter mais informações sobre conversores, consulte a seção Conversão de dados da Visão geral de associação de dados. Para obter mais informações sobre modelos de dados, consulte Visão geral de modelagem dos dados.

Usando objetos de coleção como uma origem da associação

Frequentemente, o objeto que você deseja usar como a origem da associação é uma coleção de objetos personalizados. Cada objeto serve como a fonte para uma instância de uma associação repetida. Por exemplo, você pode ter uma coleção CustomerOrders que consiste em objetos CustomerOrder, em que o aplicativo itera na coleção para determinar quantos pedidos existem e os dados contidos em cada um.

Você pode enumerar em qualquer coleção que implemente a interface IEnumerable. No entanto, para configurar associações dinâmicas para que inserções ou exclusões na coleção atualizem a interface do usuário automaticamente, a coleção deve implementar a interface INotifyCollectionChanged. Essa interface expõe um evento que deve ser acionado sempre que a coleção subjacente é alterada.

A ObservableCollection<T> classe é uma implementação interna de uma coleção de dados que expõe a INotifyCollectionChanged interface. Os objetos de dados individuais dentro da coleção devem satisfazer aos requisitos descritos nas seções anteriores. Para obter um exemplo, consulte Criar e associar a uma ObservableCollection. Antes de implementar sua própria coleção, considere usar ObservableCollection<T> ou uma das classes de coleção existentes, como List<T>, Collection<T> e BindingList<T>, entre muitas outras.

O WPF nunca se associa diretamente a uma coleção. Se você especificar uma coleção como uma origem da associação, o WPF, na verdade, associará ao modo de exibição padrão da coleção. Para obter informações sobre os modos de exibição padrão, consulte Visão geral de associação de dados.

Se você tiver um cenário avançado e quiser implementar sua própria coleção, considere usar a IList interface. IList Fornece uma coleção não genérica de objetos que podem ser acessados individualmente pelo índice, o que pode melhorar o desempenho.

Requisitos de permissão na associação de dados

Ao associar dados, você deve considerar o nível de confiança do aplicativo. A tabela a seguir resume a quais tipos de propriedades é possível vincular-se, em um aplicativo que está sendo executado em confiança parcial ou confiança total:

Tipo de propriedade

(todos os modificadores de acesso)
Propriedade de objeto dinâmico Propriedade de objeto dinâmico Propriedade do CLR Propriedade do CLR Propriedade de dependência Propriedade de dependência
Nível de confiança Confiança total Confiança parcial Confiança total Confiança parcial Confiança total Confiança parcial
Classe pública Sim Sim Sim Sim Sim Yes
Classe não pública Sim Não Sim Não Sim Yes

Essa tabela descreve os seguintes pontos importantes sobre requisitos de permissão na associação de dados:

  • Para propriedades CLR, a vinculação de dados funciona desde que o mecanismo de vinculação seja capaz de acessar a propriedade de origem da vinculação usando reflexão. Caso contrário, o mecanismo de associação emitirá um aviso de que a propriedade não pôde ser encontrada e usará o valor de fallback ou o valor padrão, se estiver disponível.

  • Você pode associar a propriedades em objetos dinâmicos que são definidos em tempo de execução ou tempo de compilação.

  • Você sempre pode associar a propriedades de dependência.

O requisito de permissão para vinculação XML é semelhante. Em uma área restrita de confiança parcial, XmlDataProvider falha quando ele não tem permissões para acessar os dados especificados.

Objetos com um tipo anônimo são internos. Você pode associar a propriedades de tipos anônimos somente durante a execução em confiança total. Para obter mais informações sobre tipos anônimos, consulte Tipos anônimos (Guia de programação em C#) ou Tipos anônimos (Visual Basic) (Visual Basic).

Para obter mais informações sobre a segurança de confiança parcial, consulte Segurança de confiança parcial do WPF.

Confira também