CW
Navegação

Idioma

🇧🇷 PT 🇺🇸 EN

Navegacao

Home Sobre Stack Empresas Blog FERRAMENTAS
CONTATO
Voltar para o Blog
14 fev. 2025 2086 Visualizações
EventToCommandBehavior no .Net9 - Não funciona mais?

EventToCommandBehavior no .Net9 - Não funciona mais?

“Resolvendo erro EventToCommandBehavior no .NET MAUI 9! Guia para corrigir o BindingContext e fazer seus comandos funcionarem novamente. #dotnetmaui”

Migrando para .NET MAUI 9: Corrigindo o Problema do Contexto de Binding do EventToCommandBehavior

Se você está migrando seu aplicativo .NET MAUI para versões mais recentes (especialmente a versão 9 ou posterior) e encontrou o erro EventToCommandBehavior que antes funcionava perfeitamente, você não está sozinho! Uma mudança sutil, mas crucial, na forma como o BindingContext é tratado para Behaviors pode causar algumas dores de cabeça. Mas não se preocupe, este post irá guiá-lo através da mudança, explicar o que aconteceu e, o mais importante, mostrar como resolver o problema.

O Cenário

Imagine que você tem um código como este, que usava o EventToCommandBehavior para executar um comando em seu ViewModel quando a página era carregada:

<ContentPage.Behaviors>
    <toolkit:EventToCommandBehavior
        EventName="Loaded"
        Command="{Binding AtualizaDadosCommand}" />
</ContentPage.Behaviors>

Em versões anteriores do .NET MAUI, isso provavelmente funcionava sem problemas. O BindingContext do Behavior era implicitamente herdado do elemento pai (a página, neste caso), que já estava corretamente definido para o seu ViewModel.

A Mudança

Em versões recentes do .NET MAUI, essa herança implícita do BindingContext para Behaviors foi removida ou alterada. Isso significa que o EventToCommandBehavior não consegue mais encontrar seu comando AtualizaDadosCommand no ViewModel, resultando em falhas ou no comando simplesmente não sendo executado.

Por que a Mudança?

As razões exatas para a mudança podem variar, mas geralmente estão relacionadas a melhorias na arquitetura do .NET MAUI, otimizações de desempenho e, possivelmente, para tornar o comportamento dos Behaviors mais consistente e previsível. Ao tornar o BindingContext explícito, o framework oferece mais controle e evita ambiguidades.

A Solução: Definindo Explicitamente o BindingContext A solução é relativamente simples, mas crucial: você precisa definir o BindingContext do EventToCommandBehavior explicitamente. Veja como:

<ContentPage.Behaviors>
    <toolkit:EventToCommandBehavior
        EventName="Loaded"
        Command="{Binding AtualizaDadosCommand}"
        BindingContext="{Binding Source={x:Reference this}, Path=BindingContext}" />
</ContentPage.Behaviors>

Entendendo a Solução

BindingContext=", Path=BindingContext}": Esta é a linha mágica!

Source=: Define a fonte do BindingContext como a própria página.

Path=BindingContext: Especifica que o valor do BindingContext a ser usado é o BindingContext da página.

Em outras palavras, estamos dizendo ao EventToCommandBehavior: "Use o mesmo BindingContext que a página tem." E como o BindingContext da página já está definido para o seu ViewModel (através da atribuição padrão de contexto de binding), o Behavior agora terá acesso ao seu comando AtualizaDadosCommand.

Exemplo Completo

Não se esqueça de dar um nome à sua página (x:Name="this") para que a referência funcione:

<ContentPage
    x:Class="YourNamespace.YourPage"
    xmlns:toolkit="[http://schemas.microsoft.com/dotnet/2022/maui/toolkit](http://schemas.microsoft.com/dotnet/2022/maui/toolkit)"
    x:Name="this">

    <ContentPage.BindingContext>
        <local:YourViewModel />
    </ContentPage.BindingContext>

    <ContentPage.Behaviors>
        <toolkit:EventToCommandBehavior
            EventName="Loaded"
            Command="{Binding AtualizaDadosCommand}"
            SourceObject="{x:Reference this}"
            BindingContext="{Binding Source={x:Reference this}, Path=BindingContext}" />
    </ContentPage.Behaviors>
</ContentPage>

ConclusĂŁo

A mudança na forma como o BindingContext é tratado para Behaviors no .NET MAUI pode ter causado alguma confusão, mas a solução é simples e direta. Ao definir explicitamente o BindingContext, você garante que seus Behaviors funcionem como esperado. Esperamos que este post tenha esclarecido a mudança e ajudado você a resolver o problema rapidamente. Se você tiver alguma dúvida, deixe um comentário abaixo!

Cezar Wagenheimer

Escrito por

Cezar Wagenheimer

Share this article

Comentários

Ficou com uma dúvida ou encontrou um problema no código? Comente abaixo — eu leio e respondo pessoalmente.

Carregando comentários…

Deixe seu comentário

Continue lendo