EventToCommandBehavior no .Net 9 – Parou de funcionar?

.NET Maui Tips & Code Smaples

Se você está migrando seu aplicativo .NET MAUI para versões mais recentes (especialmente a versão 9 ou posterior) e se deparou com o erro do 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 alguma dor de cabeça. Mas não se preocupe, este post vai te guiar pela 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 no seu ViewModel quando a página carregava:

<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, no caso), que já estava corretamente configurado para o seu ViewModel.

A Mudança:

Nas versões mais 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 o seu comando AtualizaDadosCommand no ViewModel, resultando em falhas ou o 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 o BindingContext Explicitamente

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}"
        SourceObject="{x:Reference this}"
        BindingContext="{Binding Source={x:Reference this}, Path=BindingContext}" />
</ContentPage.Behaviors>

Entendendo a Solução:

  1. SourceObject="{x:Reference this}": Esta linha é essencial e garante que o EventToCommandBehavior saiba qual objeto está gerando o evento Loaded. {x:Reference this} se refere à própria página. Sem isso, o comportamento não se conectará ao evento corretamente.
  2. BindingContext="{Binding Source={x:Reference this}, Path=BindingContext}": Esta é a linha mágica!
    • Source={x:Reference this}: 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á configurado para o seu ViewModel (através da linha ), o Behavior agora terá acesso ao seu comando AtualizaDadosCommand.

Exemplo Completo:

<ContentPage
    x:Class="YourNamespace.YourPage"
    xmlns: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 o BindingContext explicitamente, 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 tiver alguma dúvida, deixe um comentário abaixo!

5 thoughts on “EventToCommandBehavior no .Net 9 – Parou de funcionar?

    1. Hi Sayyad Hasan.
      I had this same problem.
      I resolve it following this troubleshoting:
      1) Verify if you are using the ViewModel correct;
      2) Keep a name for your ContentPage with attribute “x:name”. For example: x:Name=”myPage”;
      3) Into BindingContext set the Source with your page name and Path=”BindingContext” of

      So, your file will be like this:

      x:Name=”paginaDiServizi”
      x:DataType=”viewModel:ServiziPageViewModel”
      BackgroundColor=”{DynamicResource TertiaryLight}”>

  1. I also had to give the page a name with x:Name=”myPage” and then put “myPage” instead of “this” in x:reference, in order to get this to work.

  2. Thank you so much for this. I was ripping my hair out for a whole day trying to figure out why my .NET MAUI Community Toolkit EventToCommandBehavior was not working. I followed every guide imaginable to make it work on a Picker control, and I just could not get my Command in my ViewModel to fire until I followed your guide. The only difference for me was that I did not the line that says SourceObject=”{x:Reference this}”.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *