Я хотел бы спросить о привязках.Каков наилучший подход для связывания некоторых действий в элементах списка просмотра в 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
.
Какой подход вы используете, может быть, я что-то упускаю, и было бы идеально, если вы приведете несколько примеров или мыслей.Спасибо.