Extensões BindableObject

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.