【发布时间】:2018-05-22 16:46:53
【问题描述】:
我正在尝试设置一个项目表 (UITableView),每个单元格中都有一个按钮,可以导航到其项目的详细配置文件。
但我不确定 MvvmCross 中的正确方法是什么。我的一些想法:
- 将
ItemCellView的按钮出口公开为公共,并将其绑定在GetOrCreateCellFor内 - 将
ShowItemDetailsCommand传递给每个ItemCellView并将其绑定到那里 - 使用从
ItemCellView到ItemsView的简单回调而不是绑定 - 为每个单元格获取一个单独的
MvxViewModel并从那里调用导航服务
public class Item
{
public string Name { get; set; }
}
public class ItemsViewModel : MvxViewModel
{
public List<Item> Items { get; }
public MvxCommand ShowItemDetailsCommand { get; }
readonly IMvxNavigationService _navigationService;
readonly IDatabaseService _databaseService;
public ItemsViewModel(IMvxNavigationService navigationService, IDatabaseService databaseService)
{
ShowItemDetailsCommand = new MvxCommand(ShowItemDetails);
_navigationService = navigationService;
_databaseService = databaseService;
Items = _databaseService.SelectItems();
}
void ShowItemDetails()
{
// not sure how "item" gets here so far
_navigationService.Navigate<ItemDetailsViewModel, Item>(item);
}
}
public partial class ItemsView : MvxTableViewController<ItemsViewModel>
{
public ItemsView() : base("ItemsView", null) {}
public override void ViewDidLoad()
{
base.ViewDidLoad();
TableView = View as UITableView;
var source = new TableViewSource(TableView);
var bindings = this.CreateBindingSet<ItemsView, ItemsViewModel>();
bindings.Bind(source).To(vm => vm.Items);
bindings.Apply();
TableView.Source = source;
TableView.ReloadData();
}
public class TableViewSource : MvxTableViewSource
{
public TableViewSource(UITableView tableView) : base(tableView)
{
TableView.RegisterNibForCellReuse(UINib.FromName("ItemCellView", NSBundle.MainBundle), ItemCellView.kCellId);
}
protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
{
return TableView.DequeueReusableCell(ItemCellView.kCellId, indexPath) as ItemCellView;
}
}
}
public partial class ItemCellView : MvxTableViewCell
{
public const string kCellId = "item_cell";
// also has an [Outlet] UIButton in the .designer.cs part
public ItemCellView(IntPtr handle) : base(handle)
{
this.DelayBind(() =>
{
var bindings = this.CreateBindingSet<ItemCellView, Item>();
bindings.Bind(Name).To(i => i.Name);
bindings.Apply();
});
}
}
【问题讨论】:
标签: xamarin.ios mvvmcross