Да, вы можете привязать команду каждого столбца к 4 различным командам вашей модели представления. Вот демо из GitHub Акалиаро. Вы можете проверить это здесь .
Хотя это кодируется в c #, а не в xaml, вы можете легко конвертировать его в Xaml.
Основной код:
this.BindingContext = new MyPageViewModel();
TapGestureRecognizer tgrTrash = new TapGestureRecognizer();
tgrTrash.SetBinding(TapGestureRecognizer.CommandProperty, new
Binding("BindingContext.TrashCommand", source: this));
tgrTrash.SetBinding(TapGestureRecognizer.CommandParameterProperty, ".");
класс MyPageViewModel (BindingContext)
[ImplementPropertyChanged]
public class MyPageViewModel
{
bool _isLabelEmptyVisible { get; set; }
Model _selectedItem { get; set; }
bool _isTapped { get; set; }
int _count { get; set; }
int Count {
get { return _count; }
set { _count = value;
IsListViewVisible = (_count != 0);
IsLabelEmptyVisible = (_count == 0); }
}
public bool IsLabelEmptyVisible { get; set; }
public bool IsListViewVisible { get; set; }
public ObservableCollection<Model> List { get; set; } = new ObservableCollection<Model>();
public MyPageViewModel()
{
addRows();
this.TrashCommand = new Command(async (object obj) => {
try
{
if (_isTapped)
return;
if (obj != null)
System.Diagnostics.Debug.WriteLine("Obj is not null");
else
System.Diagnostics.Debug.WriteLine("Obj IS null");
_isTapped = true;
var ret = await Application.Current.MainPage.DisplayAlert("Attention", "Delete this row?", "Yes", "No");
if (ret)
{
//int idx = List.IndexOf((Model)obj);
List.Remove((Model)obj);
Count = List.Count;
}
_isTapped = false;
}
catch (Exception ex) {
_isTapped = false;
await Application.Current.MainPage.DisplayAlert("Attention", ex.Message, "Ok");
}
});
}
private void addRows() {
List.Add(new Model { Description = "D1", Cost = 10.0, Qty = 1, BackgroundColor = "#9ac16e", TextColor = "#001833" });
}
public Model SelectedItem {
get { return _selectedItem; }
set {
_selectedItem = value;
if (_selectedItem != null) {
//Task.Run(async () =>
//{
Device.BeginInvokeOnMainThread(async() =>
{
var ret = await Application.Current.MainPage.DisplayActionSheet("Select", "Cancel", "Destruction", new string[] { "Edit", "Delete" });
if (ret == "Edit")
{
PromptConfig promptConfig = new PromptConfig();
promptConfig.CancelText = "CANCEL";
promptConfig.InputType = InputType.Number;
promptConfig.Message = "Modify QTA";
promptConfig.OkText = "OK";
promptConfig.Title = "UPDATE";
PromptResult result = await UserDialogs.Instance.PromptAsync(promptConfig);
if (result.Ok)
SelectedItem.Qty = int.Parse(result.Value);
}
else if (ret == "Delete")
{
List.Remove(SelectedItem);
Count = List.Count;
}
else { }
});
//});
}
}
}
public ICommand TrashCommand { get; protected set;}
}