Compartilhar via


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

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 completos.

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 vinculaçã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 da 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 da interface do usuário. A maioria dos primeiros exemplos de vinculação de dados neste capítulo demonstra essa técnica.

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

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

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

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

  • INotifyPropertyChanged no namespace é para implementar a System.ComponentModel 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 chamadas de origem e destino. Geralmente, uma alteração na propriedade source faz com que uma alteração ocorra na propriedade de destino, mas às vezes a direção é invertida. Independentemente:

Uma classe que implementa INotifyPropertyChanged dispara um PropertyChanged evento quando uma propriedade altera o valor. BindableObject Implementa INotifyPropertyChanged e dispara automaticamente um PropertyChanged evento quando uma propriedade apoiada por um BindableProperty altera valores, mas você pode escrever suas próprias 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 fonte é propriedade Value de um Slider
  • O destino é a Opacity propriedade de um Label

Os dois objetos são conectados definindo o BindingContextLabel do objeto para o Slider objeto. As duas propriedades são conectadas chamando Label um SetBinding método de extensão na referência a OpacityProperty propriedade bindable e a ValueSlider propriedade do expresso como uma cadeia de caracteres.

Manipular o Slider então faz com que o Label fade in e out of view.

O OpacityBindingXaml é o mesmo programa com a associação de dados definida em XAML. O BindingContext de é Label definido como uma x:Reference extensão de marcação fazendo referência ao Slider, e a Opacity propriedade do é definida como a Binding extensão de Label marcação com sua Path propriedade fazendo referência à 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 para o Slider objeto e a Path propriedade para "Value". O SetBinding método de BindableObject é então chamado no Label objeto.

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

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

Em resumo, há duas maneiras de fazer referência ao objeto de origem da vinculação:

  • Através da BindingContext propriedade do alvo
  • Através da Source propriedade do Binding próprio objeto

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

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

O modo de vinculação

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

  • OneWay para que as alterações na propriedade source 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 nenhum foi especificado, o padrão é OneWay para propriedades vinculáveis normais e OneWayToSource para propriedades vinculáveis somente leitura.

Observação

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

As propriedades que provavelmente serão os destinos de associações de dados em cenários MVVM geralmente têm um DefaultBindingMode de TwoWay. Estes 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 a Label e a origem é a Value propriedade de um Slider. Isso permite que cada um Slider controle o tamanho da fonte do arquivo Label. Mas os Slider elementos não são inicializados porque o DefaultBindingModeFontSize da propriedade é OneWay.

O exemplo ReverseBinding define as ligações na Value propriedade da Slider referência a FontSize propriedade de cada Label. Isso parece ser para trás, mas funciona melhor em inicializar os Slider elementos porque a SliderValue propriedade do tem um DefaultBindingMode de TwoWay.

Captura de tela tripla da vinculação reversa

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

Formatação da cadeia de caracteres

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

O exemplo ShowViewValues demonstra como usar StringFormat em XAML.

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

Por que se chama "Caminho"?

A Path propriedade de Binding é assim chamada porque pode ser uma série de propriedades e indexadores separados por pontos. 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 vinculação. Essa é uma classe que implementa a IValueConverter interface e contém dois métodos: Convert converter a origem em destino e ConvertBack converter o destino em origem.

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

A BoolToStringConverter classe converte a bool em a string e define duas propriedades para especificar para qual texto deve ser retornado e falsetrue valores. O BoolToColorConverter é parecido. 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 o BoolToStringConverter e BoolToColorConverter e servir como um boolconversor generalizado -para-objeto de qualquer tipo.

Ligações e modos de exibição personalizados

Você pode simplificar controles personalizados usando associações de dados. O NewCheckBox.cs arquivo de código define Text, TextColor, FontAttributesFontSize, e IsChecked propriedades, mas não tem lógica alguma para os elementos visuais do controle. Em vez disso, o NewCheckBox.cs.xaml arquivo contém toda a marcação para os elementos 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.