Инструментарий сообщества MAUI EventToCommandBehavior

Я отчаянно пытаюсь придерживаться шаблона проектирования MVVM в своем приложении. Поэтому я пытаюсь использоватьEventToCommandBehaviorповедение от MCT. (Я также использую CommunityToolkit.Mvvm для[RelayCommand]) я приложил его кEntryи я пытаюсь переслать событие TextChanged моей команде. Однако моя команда не выполняется.

XAML:

      <?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
             x:Class="MyApp.View.Accounts.AddAccountPage"
             xmlns:viewmodel="clr-namespace:MyApp.ViewModel.AccountsViewModel"
             Title="Add Account">
    <VerticalStackLayout>

        <Entry x:Name="entryAccountName"
               Placeholder="Account Name" 
               PlaceholderColor="Black"
               TextColor="{StaticResource Tertiary}"
               BackgroundColor="{StaticResource Primary}"
               WidthRequest="125"
               HorizontalOptions="Center"
               Keyboard="Text"
               ClearButtonVisibility="WhileEditing"
               ReturnType="Next">
            <Entry.Behaviors>
                <toolkit:EventToCommandBehavior
                        EventName="TextChanged"
                        Command="{Binding AccountTextChangedCommand}" />
            </Entry.Behaviors>
        </Entry>
....More XAML....

Код AccountsViewModel:

          [RelayCommand]
    public void AccountTextChanged()
    {
        Application.Current.MainPage.DisplayAlert("Text changed", "Account Text Changed", "OK");
    }

У меня есть точка останова, установленная для метода, и она просто никогда не вызывается. Любые идеи относительно того, что я делаю неправильно?

1 ответ

Я наконец-то понял. Я забыл установить BindingContext в AccountsViewModel в конструкторе страницы:

      using MyApp.Services;
using MyApp.ViewModel.AccountsViewModel;

namespace MyApp.View.Accounts;

public partial class AddAccountPage : ContentPage
{
    public AddAccountPage()
    {
        InitializeComponent();
        DataService dataService = new();
        AccountsViewModel accountsViewModel = new(dataService);
        BindingContext = accountsViewModel;
    }
}

Мне приходилось устанавливать BindingContext через конструкторы на разных страницах, чтобы привязки данных работали, хотя я ссылаюсь на ViewModels в заголовке XAML. Это так задумано или я ошибаюсь?

Другие вопросы по тегам