Лучший способ решить эту проблему - использовать CommandParameter
и решить, что делать с вашим ViewModel
на основе контекста данных ViewCell
.
Если вы используете Binding, вы можете привязать весь контекст текущих данных, выбрав a. (точка), таким образом данные из текущего ViewCell передаются в вашу ViewModel.
Давайте покажем, как вы кодируете это ...
Ваше мнение должно выглядеть следующим образом
<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:TestCommand"
x:Name="TestPage"
x:Class="TestCommand.MainPage">
<StackLayout>
<ListView ItemsSource="{Binding Persons}" RowHeight="50">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Label Text="{Binding Name}" />
<Button Text="Click" Command="{Binding DoCommand, Source={x:Reference TestPage}}" CommandParameter="{Binding .}" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
Обратите внимание, что вам нужно указать имя для вашей страницы! При этом вы можете указывать на одну и ту же команду в каждой ViewCell. Но передайте текущие данные ViewCell с помощью параметра командной строки.
В вашей ViewModel вы можете воздействовать на «выбранные» данные ... и делать что-то конкретное, например, так:
public List<Person> Persons { get; set; } = new List<Person>() { new Person() { Name = "Glenn Versweyveld" }, new Person() { Name = "John Do" } };
private Command<Person> _doCommand;
public Command<Person> DoCommand => _doCommand ?? (_doCommand = new Command<Person>((Person obj) => HandlePerson(obj)));
private void HandlePerson(Person obj)
{
}