Родной Xamarin, Связывание действий с элементами списка - PullRequest
0 голосов
/ 11 декабря 2018

Я хотел бы спросить о привязках.Каков наилучший подход для связывания некоторых действий в элементах списка просмотра в iOS и Android с использованием xamarin в мире mvvm.Как я понимаю, у нас мало подходов.

1.Для каждого элемента списка у нас есть немного Model, и к этой модели мы должны добавить немного Commands.

Например:

public class ItemModel
{
    public string MyName { get; set; }
    public ICommand RemoveCommand { get; set; }
}

Где в ViewModel у нас есть SomeInitMethod

public class ViewModel
{
    public ObservableCollection<ItemModel> Items {get;set;}

    public async Task SomeInitMethod
    {
        Items = new ObservableCollection(await _myApiService.FetchItemsAsync());

        foreach(var item in Items)
        {
            item.Command = new RelayCommand(RemoveItem);
        }
    }

    public void RemoveItem(ItemModel item)
    {
        Items.Remove(item);
    }
}

Но я вижу недостаток в SomeInitMethod, где мы должны установить RemoveCommand.Что если нам нужно установить 2 или даже больше команд, чем дублируем код в ListItemView (каким-то образом нам нужно связать все эти команды)?

Следующий подход заключается в том, чтобы как-то обрабатывать события кнопок удаления / переключения и других в Listview, а затем делегировать эти команды непосредственно ViewModel.

Пример:

ContactsListView.ItemRemoveClicked += (ItemModel model) => ViewModel.RemoveItem

Преимущества: нам больше не нужно обрабатывать команды в ViewModel. Недостаток: нам нужно каждый раз писать собственный ListView и поддерживать обработку событий в коде.позади.

Последний подход - отправить ViewModel на ListItem для установки Commands.Пример где-то у нас есть метод CreateListViewItem на представлении, скажем, на iOS.
private void InitTableView() {
    TableView.RegisterNibForCellReuse(ItemViewCell.Nib, ItemViewCell.Key);

    var source = new ObservableTableViewSource <ItemModel>
    {
        DataSource = ViewModel.Items,
        BindCellDelegate = (cell, viewModel, index) =>
        {
            if (cell is ItemModel memberCell)
            {
                memberCell.BindViewModel(viewModel);
                memberCell.RemoveItem = (item) => ViewModel.RemoveItem;
            }
        }
    };

    TableView.Source = source;
}

Преимущества : нам больше не нужно иметь Commandsв Model, и нам не нужно настраивать это Commands в ViewModel.

Возможно, недостатком является то, что нам как-то нужна ссылка ViewModel.

В WPF илиUWP у вас есть DataContext, вы можете напрямую связываться с ViewModel.

Какой подход вы используете, может быть, я что-то упускаю, и было бы идеально, если вы приведете несколько примеров или мыслей.Спасибо.

...