Resumo do Capítulo 16. Vinculação de dados

Baixar exemplo Baixar o exemplo

Observação

Este livro foi publicado na primavera de 2016, e não foi atualizado desde então. Há muito no livro que permanece valioso, mas parte do material está desatualizado, e alguns tópicos não estão mais totalmente corretos ou concluídos.

Os programadores geralmente se encontram escrevendo manipuladores de eventos que detectam quando uma propriedade de um objeto foi alterada e usam isso para alterar o valor de uma propriedade em outro objeto. Esse processo pode ser automatizado com a técnica de associação de dados. As associações de dados geralmente são definidas em XAML e se tornam parte da definição da interface do usuário.

Muitas vezes, essas associações de dados conectam objetos de interface do usuário a dados subjacentes. Essa é uma técnica que é mais explorada no Capítulo 18. MVVM. No entanto, as associações de dados também podem conectar dois ou mais elementos de interface do usuário. A maioria dos primeiros exemplos de associação de dados neste capítulo demonstra essa técnica.

Noções básicas de associação

Várias propriedades, métodos e classes estão envolvidos na associação de dados:

As duas classes a seguir dão suporte a extensões de marcação XAML para associações:

Duas interfaces estão envolvidas na associação de dados:

  • INotifyPropertyChanged no System.ComponentModel namespace é para implementar a notificação quando uma propriedade é alterada
  • IValueConverter é usado para definir classes pequenas que convertem valores de um tipo para outro em associações de dados

Uma associação de dados conecta duas propriedades do mesmo objeto ou (mais comumente) dois objetos diferentes. Essas duas propriedades são conhecidas como a origem e o destino. Geralmente, uma alteração na propriedade de origem faz com que uma alteração ocorra na propriedade de destino, mas às vezes a direção é invertida. Independentemente:

Uma classe que implementa aciona INotifyPropertyChanged um PropertyChanged evento quando uma propriedade altera o valor. BindableObjectimplementa e dispara automaticamente um PropertyChanged evento quando uma propriedade apoiada por um BindableProperty altera valores, mas você pode escrever suas próprias INotifyPropertyChanged classes que implementam INotifyPropertyChanged sem derivar de BindableObject.

Código e XAML

O exemplo OpacityBindingCode demonstra como definir uma associação de dados no código:

  • A origem é a Value propriedade de um Slider
  • O destino é a Opacity propriedade de um Label

Os dois objetos são conectados definindo o BindingContextLabel do objeto como o Slider objeto . As duas propriedades são conectadas chamando um SetBinding método de extensão na referência à LabelOpacityProperty propriedade associável e à Value propriedade do Slider expresso como uma cadeia de caracteres.

Manipular o Slider faz com que o Label esmaeça e saia da exibição.

O OpacityBindingXaml é o mesmo programa com o conjunto de associação de dados em XAML. O BindingContext do Label é definido como uma x:Reference extensão de marcação referenciando o Slidere a Opacity propriedade do Label é definida como a Binding extensão de marcação com sua Path propriedade referenciando a Value propriedade do Slider.

Source e BindingContext

O exemplo BindingSourceCode mostra uma abordagem alternativa no código. Um Binding objeto é criado definindo a Source propriedade como o Slider objeto e a Path propriedade como "Value". O SetBinding método de BindableObject é então chamado no Label objeto .

O Binding construtor também pode ter sido usado para definir o Binding objeto.

O exemplo BindingSourceXaml mostra a técnica comparável em XAML. A Opacity propriedade do Label é definida como uma Binding extensão de marcação com definida como Path a Value propriedade e Source definida como uma extensão de marcação inserida x:Reference .

Em resumo, há duas maneiras de referenciar o objeto de origem de associação:

  • Por meio da BindingContext propriedade do destino
  • Por meio da Source propriedade do Binding próprio objeto

Se ambos forem especificados, o segundo terá precedência. A vantagem do BindingContext é que ele é propagado por meio da árvore visual. Isso será muito útil se várias propriedades de destino estiverem associadas ao mesmo objeto de origem.

O programa WebViewDemo demonstra essa técnica com o WebView elemento . Dois Button elementos para navegar para trás e para frente herdam um BindingContext de seu pai que faz referência ao WebView. As IsEnabled propriedades dos dois botões têm extensões de marcação simples Binding direcionadas às propriedades do botão IsEnabled com base nas configurações das CanGoBack propriedades e CanGoForward somente leitura do WebView.

O modo de associação

Defina a Mode propriedade de Binding como um membro da BindingMode enumeração:

  • OneWay para que as alterações na propriedade de origem afetem o destino
  • OneWayToSource para que as alterações na propriedade de destino afetem a origem
  • TwoWay para que as alterações na origem e no destino afetem umas às outras
  • Default para usar o DefaultBindingMode especificado quando o destino BindableProperty foi criado. Se nenhuma tiver sido especificada, o padrão será OneWay para propriedades associáveis normais e OneWayToSource para propriedades associáveis somente leitura.

Observação

A BindingMode enumeração agora também inclui OnTime a aplicação de uma associação somente quando o contexto de associação é alterado e não quando a propriedade de origem é alterada.

As propriedades que provavelmente serão destinos de associações de dados em cenários MVVM geralmente têm um DefaultBindingMode de TwoWay. Eles são:

  • Propriedade Value de Slider e Stepper
  • Propriedade IsToggled de Switch
  • Text propriedade de Entry, Editore SearchBar
  • Propriedade Date de DatePicker
  • Propriedade Time de TimePicker

O exemplo BindingModes demonstra os quatro modos de associação com uma associação de dados em que o destino é a FontSize propriedade de um Label e a origem é a Value propriedade de um Slider. Isso permite que cada um Slider controle o tamanho da fonte do correspondente Label. Mas os Slider elementos não são inicializados porque o FontSizeDefaultBindingMode da propriedade é OneWay.

O exemplo ReverseBinding define as associações na Value propriedade de Slider referenciando a FontSize propriedade de cada Label. Isso parece ser versões anteriores, mas funciona melhor na inicialização dos Slider elementos porque a Value propriedade do Slider tem um DefaultBindingMode de TwoWay.

de tela tripla de associação reversa da associação reversa

Isso é análogo à forma como as associações são definidas no MVVM e você usará esse tipo de associação com frequência.

Formatação de cadeia de caracteres

Quando a propriedade de destino for do tipo string, você poderá usar a StringFormat propriedade definida por BindingBase para converter a origem em um string. Defina a StringFormat propriedade como uma cadeia de caracteres de formatação do .NET que você usaria com o formato estático String.Format para exibir o objeto. Ao usar essa cadeia de caracteres de formatação dentro de uma extensão de marcação, coloque-a entre aspas simples para que as chaves não sejam confundidas com uma extensão de marcação inserida.

O exemplo ShowViewValues demonstra como usar StringFormat no XAML.

O exemplo WhatSizeBindings demonstra a exibição do tamanho da página com associações às Width propriedades e Height do ContentPage.

Por que é chamado de "Caminho"?

A Path propriedade de Binding é chamada assim porque pode ser uma série de propriedades e indexadores separados por períodos. O exemplo BindingPathDemos mostra vários exemplos.

Conversores de valor de associação

Quando as propriedades de origem e destino de uma associação são tipos diferentes, você pode converter entre os tipos usando um conversor de associação. Essa é uma classe que implementa a IValueConverter interface e contém dois métodos: Convert converter a origem no destino e ConvertBack converter o destino na origem.

A IntToBoolConverter classe na Xamarin.Formsbiblioteca Book.Toolkit é um exemplo para converter um int em um bool. Ele é demonstrado pelo exemplo ButtonEnabler , que só habilita o Button se pelo menos um caractere tiver sido digitado em um Entry.

A BoolToStringConverter classe converte um bool em um string e define duas propriedades para especificar quais textos devem ser retornados para false os valores e true . O BoolToColorConverter é semelhante. O exemplo SwitchText demonstra o uso desses dois conversores para exibir textos diferentes em cores diferentes com base em uma Switch configuração.

O genérico BoolToObjectConverter pode substituir e BoolToStringConverterBoolToColorConverter e servir como um conversor generalizado boolpara objeto de qualquer tipo.

Associações e exibições personalizadas

Você pode simplificar controles personalizados usando associações de dados. O NewCheckBox.cs arquivo de código define Textas propriedades , TextColor, FontSize, FontAttributese IsChecked , mas não tem nenhuma lógica para os visuais do controle. Em vez disso, o NewCheckBox.cs.xaml arquivo contém toda a marcação para os visuais do controle por meio de associações de dados nos Label elementos com base nas propriedades definidas no arquivo code-behind.

O exemplo NewCheckBoxDemo demonstra o NewCheckBox controle personalizado.