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 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:
- A
Binding
classe deriva deBindingBase
e encapsula muitas características de uma associação de dados - A
BindingContext
propriedade é definida pelaBindableObject
classe - O
SetBinding
método também é definido pelaBindableObject
classe - A
BindableObjectExtensions
classe define três métodos adicionaisSetBinding
As duas classes a seguir dão suporte a extensões de marcação XAML para associações:
BindingExtension
dá suporte àBinding
extensão de marcaçãoReferenceExtension
dá suporte àx:Reference
extensão de marcação
Duas interfaces estão envolvidas na associação de dados:
INotifyPropertyChanged
noSystem.ComponentModel
namespace é para implementar a notificação quando uma propriedade é alteradaIValueConverter
é 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:
- a propriedade de destino deve ser apoiada por um
BindableProperty
- a propriedade de origem geralmente é um membro de uma classe que implementa
INotifyPropertyChanged
Uma classe que implementa aciona INotifyPropertyChanged
um PropertyChanged
evento quando uma propriedade altera o valor. BindableObject
implementa 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 umSlider
- O destino é a
Opacity
propriedade de umLabel
Os dois objetos são conectados definindo o BindingContext
Label
do objeto como o Slider
objeto . As duas propriedades são conectadas chamando um SetBinding
método de extensão na referência à Label
OpacityProperty
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 Slider
e 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 doBinding
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 destinoOneWayToSource
para que as alterações na propriedade de destino afetem a origemTwoWay
para que as alterações na origem e no destino afetem umas às outrasDefault
para usar oDefaultBindingMode
especificado quando o destinoBindableProperty
foi criado. Se nenhuma tiver sido especificada, o padrão seráOneWay
para propriedades associáveis normais eOneWayToSource
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
deSlider
eStepper
- Propriedade
IsToggled
deSwitch
Text
propriedade deEntry
,Editor
eSearchBar
- Propriedade
Date
deDatePicker
- Propriedade
Time
deTimePicker
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 FontSize
DefaultBindingMode
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
.
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 BoolToStringConverter
BoolToColorConverter
e servir como um conversor generalizado bool
para 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 Text
as propriedades , TextColor
, FontSize
, FontAttributes
e 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.