Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
As extensões BindableObject oferecem uma série de métodos de extensão que suportam a configuração de Bindings num BindableObject.
As extensões oferecem os seguintes métodos:
Vincular
O Bind método oferece várias sobrecargas, proporcionando diferentes conveniências em torno da configuração de um Binding. Para mais informações sobre as possibilidades de dados Binding numa aplicação .NET MAUI, consulte a documentação Microsoft.
Example
Existem várias sobrecargas para o Bind método.
Ligação unidirecional
Uma ligação unidirecional a partir de uma propriedade de modelo de visualização (RegistrationViewModel) chamada RegistrationCode para a propriedade Text de um Label pode ser criada do seguinte modo:
new Entry()
.Bind(Label.TextProperty,
getter: static (RegistrationViewModel vm) => vm.RegistrationCode)
Ligação bidirecional
Uma ligação bidirecional de uma propriedade de view model (RegistrationViewModel) chamada RegistrationCode para a propriedade Text de um Entry pode ser criada da seguinte forma:
new Entry()
.Bind(Entry.TextProperty,
getter: static (RegistrationViewModel vm) => vm.RegistrationCode,
setter: static (RegistrationViewModel vm, string code) => vm.RegistrationCode = code)
Vinculações Complexas (Aninhadas)
Ao ligar a uma propriedade dentro de uma propriedade (também conhecida como "Ligações Aninhadas"), é necessário o handlers parâmetro. O handler parâmetro requer uma referência a cada Propriedade na cadeia de ligação complexa.
Juntamente com o exemplo abaixo, pode encontrar exemplos adicionais de ligações complexas nos Testes Unitários para CommunityToolkit.Maui.Markup.
Exemplo de Ligações Complexas (Aninhadas)
Usando a classe abaixo ViewModel , podemos criar uma ligação bidirecional aninhada diretamente para ViewModel.NestedObject.Text usando o handlers parâmetro:
new Entry().Bind(
Entry.TextProperty,
getter: static (ViewModel vm) => vm.NestedObject.Text,
handlers:
[
(vm => vm, nameof(ViewModel.NestedObject)),
(vm => vm.NestedObject, nameof(ViewModel.NestedObject.Text)),
],
setter: static (ViewModel vm, string text) => vm.NestedObject.Text = text);
class ViewModel
{
public NestedObject NestedObject { get; set; } = new();
public required string Text { get; set; }
}
class NestedObject
{
public required string Text { get; set; }
}
Propriedade padrão
O método Bind pode ser chamado sem especificar a propriedade para configurar a ligação, o que utilizará os valores predefinidos fornecidos pela biblioteca com a lista completa no repositório GitHub.
A propriedade padrão para atribuir a um Entry é a propriedade texto. Assim, o exemplo acima poderia ser escrito como:
new Entry().Bind(nameof(ViewModel.RegistrationCode))
Warning
Esta abordagem resultará na utilização de algum nível de Reflexão e não terá um desempenho tão eficaz quanto a abordagem de propriedade explícita .
Warning
Associações como esta, que usam um string para o parâmetro path:, não são seguras em termos de trimming
Conversão de valor
O método Bind permite que um programador forneça o Converter que pretende usar na associação ou simplesmente especifique um mecanismo para usar uma conversão em linha.
Conversor
new Entry()
.Bind(Entry.TextProperty,
getter: static (RegistrationViewModel vm) => vm.RegistrationCode,
converter: new TextCaseConverter { Type = TextCaseType.Upper });
Veja TextCaseConverter para a documentação sobre a sua utilização completa.
Conversão integrada
new Entry()
.Bind(Entry.TextProperty,
getter: static (RegistrationViewModel vm) => vm.RegistrationCode,
convert: (string? text) => text?.ToUpperInvariant());
Encadernações Múltiplas
Múltiplas Ligações podem ser agregadas aproveitando o IMultiValueConverter.
O parâmetro convert é um(a) Func necessário(a) para converter as associações múltiplas no resultado necessário.
new Label()
.Bind(Label.TextProperty,
binding1: BindingBase.Create((ViewModel vm) => vm.IsBusy),
binding2: BindingBase.Create((ViewModel vm) => vm.LabelText),
convert: ((bool IsBusy, string LabelText) values) => values.IsBusy ? string.Empty : values.LabelText)
BindCommand
O método BindCommand fornece uma forma útil de configurar uma ligação a um padrão fornecido pela biblioteca, com a lista completa no repositório GitHub.
O comando predefinido para associar a um Button é a propriedade Command. Assim, o exemplo seguinte estabelece uma ligação a essa propriedade.
new Button().BindCommand(static (ViewModel vm) => vm.SubmitCommand);
O acima também pode ser escrito como:
Observação
Se o comando padrão não resultar em ligar ao comando desejado, então pode usar o Bind método.
new Button()
.Bind(Entry.CommandProperty,
getter: static (RegistrationViewModel vm) => vm.SubmitCommand,
mode: BindingMode.OneTime);
Ligação por gestos
As ligações por gesto permitem-nos criar um ClickGestureRecognizer, SwipeGestureRecognizer, TapGestureRecognizer, anexá-lo a qualquer elemento que implemente IGestureRecognizer e associá-lo a um ICommand no nosso ViewModel.
BindClickGesture
O exemplo seguinte demonstra como criar um ClickGestureRecognizer que requer 2 cliques para ativar, anexá-lo a um Label e associá-lo a uma propriedade ICommand chamada ClickCommand no nosso ViewModel:
new Label()
.BindClickGesture(
static (ViewModel vm) => vm.ClickCommand,
commandBindingMode: BindingMode.OneTime,
numberOfClicksRequired: 2));
BindSwipeGesture
O exemplo seguinte demonstra como criar um SwipeGestureRecognizer que requer SwipeDirection.Up para o seu SwipeDirection e uma distância mínima de 200 pontos para o seu Threshold, depois anexá-lo a Label e ligá-lo a uma ICommand propriedade chamada SwipeCommand no nosso ViewModel:
new Label()
.BindSwipeGesture(
static (ViewModel vm) => vm.SwipeCommand,
commandBindingMode: BindingMode.OneTime,
direction: SwipeDirection.Up,
threshold: 200);
BindTapGesture
O exemplo seguinte demonstra como criar um ClickGestureRecognizer que requer 2 toques para ativar, anexá-lo a um Label e vinculá-lo a uma propriedade ICommand denominada TapCommand no nosso ViewModel:
new Label()
.BindTapGesture(
static (ViewModel vm) => vm.TapCommand,
commandBindingMode: BindingMode.OneTime,
numberOfTapsRequired: 2));
AppThemeBinding
O método AppThemeBinding permite atribuir um valor claro e um valor escuro a um BindableProperty, para que, quando o AppTheme da aplicação for alterado, seja utilizado o valor apropriado para esse tema.
O exemplo seguinte atribuirá a cor preta à propriedade Text do controlo Label se a aplicação estiver em execução no tema claro e a cor branca no tema escuro.
new Label().AppThemeBinding(Label.TextColorProperty, Colors.Black, Colors.White);
Observação
Existe um método mais específico quando se trata de Color propriedades.
AppThemeColorBinding irá executar o mesmo comportamento subjacente que AppThemeBinding , mas requer um conjunto de Color parâmetros.
Para mais informações, consulte a documentação de Tematização.
Exemplos
Pode encontrar um exemplo destes métodos de extensão em ação ao longo do .NET MAUI Community Toolkit Sample Application.
API
Pode encontrar o código-fonte dos métodos de extensão BindableObject no repositório do GitHub do .NET MAUI Community Toolkit.
.NET MAUI Community Toolkit