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()