Collectionview SelectionChangeCommand не работает с CommunityToolkit.Mvvm .NET MAUI

У меня есть простой проект, использующий инструмент Community Toolkit Mvvm и представление коллекции. Проблема в том, что SelectionChangeCommand в CollectionView не срабатывает, когда я выбираю элемент коллекции. Я создал этот проект, потому что в другом более сложном проекте ошибка заключается в том, что он не может найти команду привязки в модели представления. Я знаю, что связь между представлением и моделью представления работает, потому что представление коллекции заполняется элементами модели представления, а также я могу изменить видимость границы через связанное свойство.

Пример проекта: https://github.com/luis95gr/MvvmError.App

Код

LoginPage (первая страница с коллекцией)

      <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="MvvmError.Views.LoginPage"
         xmlns:models="clr-namespace:MvvmError.Models"
         Title="LoginPage">

<RefreshView VerticalOptions="FillAndExpand">
    <Border BackgroundColor="Red" IsVisible="{Binding Visible}" Stroke="Red" HorizontalOptions="FillAndExpand" Padding="0,0" Margin="0,0,0,0" VerticalOptions="FillAndExpand">
        <Border.StrokeShape>
            <RoundRectangle CornerRadius="40,0,0,0" />
        </Border.StrokeShape>
        <CollectionView Background="Transparent" ItemsSource="{Binding Messages}" SelectionMode="Single" SelectedItem="{Binding MessageSelected}"  SelectionChangedCommand="{Binding MessageSelectedCommand}">
            <CollectionView.ItemTemplate>
                <DataTemplate x:DataType="models:MessagesMessages">
                    <Grid RowDefinitions="100*" ColumnDefinitions="100*">
                        <Label Grid.Row="0" Text="{Binding Asunto}" />
                    </Grid>

                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>

    </Border>
</RefreshView>

логинпажевиевмодель

      public partial class LoginPageViewModel : ObservableObject
{
    [ObservableProperty]
    private MessagesMessages messageSelected;

    [ObservableProperty]
    private bool visible;

    public ObservableCollection<MessagesMessages> Messages { get; } = new();

    public LoginPageViewModel()
    {
        Visible = true;
        GetMessages();
    }


    [RelayCommand]
    async void MessageSelectedCommand()
    {
        var snackbar = Snackbar.Make("Hola");

        await snackbar.Show();
    }

    private void GetMessages()
    {
        Messages.Add(new MessagesMessages
        {
            Asunto = "Hola"
        });
        Messages.Add(new MessagesMessages
        {
            Asunto = "Hola1"
        });
        Messages.Add(new MessagesMessages
        {
            Asunto = "Hola2"
        });
        Messages.Add(new MessagesMessages
        {
            Asunto = "Hola3"
        });
    }

}

Логинпаже.xaml.cs

      public partial class LoginPage : ContentPage
{
   public LoginPage(LoginPageViewModel loginPageViewModel)
   {
       InitializeComponent();
       BindingContext= loginPageViewModel;
   }
}

MauiProgram.cs

      builder.Services.AddTransient<LoginPage>();
builder.Services.AddSingleton<ViewModels.LoginPageViewModel>();

1 ответ

вы не следуете соглашению об именах

Имя сгенерированной команды будет создано на основе имени метода. Генератор будет использовать имя метода и добавит «Command» в конце, а также удалит префикс «On», если он присутствует. Кроме того, для асинхронных методов суффикс «Async» также удаляется перед добавлением «Command».

для создания команды с именемMessageSelectedCommandваш метод должен выглядеть

      [RelayCommand]
async void MessageSelected()
Другие вопросы по тегам