[英]Unable to Bind MvvMCross 6.x iOS color to MvxColor WithConversion
[英]Unable to bind to ios table section cells in mvvmcross, child cells bind as expected
我正在尝试创建具有分组部分的TableView,如下所示:
我将组列表绑定到表。 一个组包含一些字符串属性和一个项目列表,而一个项目也包含一些字符串属性。 组和项目单元格都有各自的类,这些类扩展了MvxTableViewCell
。
在类中,我要绑定的每个单元格如下:
项目单元格:
this.DelayBind(() =>
{
var set = this.CreateBindingSet<ItemCellView, ItemCellViewModel>();
set.Bind(lblOne).To(item=> item.propertyOne);
set.Apply();
});
和组单元格:
this.DelayBind(() =>
{
var set = this.CreateBindingSet<GroupCellView, GroupCellViewModel>();
set.Bind(lblOne).To(group=> group.propertyOne);
set.Apply();
});
我在主视图中的MvxStandardTableViewSource
扩展了MvxStandardTableViewSource
并使用重写的方法来获取表的各个单元格。 public override UIView GetViewForHeader
返回组单元格视图,而protected override UITableViewCell GetOrCreateCellFor
返回项目单元格视图。
我的问题是,即使我看不到两者之间没有明显的区别,组视图单元格也不会绑定,而项目视图单元格则绑定得很好。 但是,正在构建组视图单元,只是单元内部没有发生绑定。
编辑:添加了表格视图源:
private class TableSource : MvxStandardTableViewSource
{
private List<GroupCellViewModel> _groups;
public new List<GroupCellViewModel> ItemsSource
{
get
{
return _groups;
}
set
{
_groups = value;
ReloadTableData();
}
}
public TableSource(UITableView tableView)
: base(tableView)
{
}
public override string TitleForHeader(UITableView tableView, int group)
{
if (_groups == null)
return string.Empty;
return Utils.FormatDate(_groups[group].Date);
}
public override UIView GetViewForHeader(UITableView tableView, int group)
{
return MakeHeaderRow(tableView, _groups[group]);
}
public override float GetHeightForHeader(UITableView tableView, int section)
{
return 50;
}
public override float GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
{
return 50;
}
public override int NumberOfSections(UITableView tableView)
{
if (_groups == null)
return 0;
return _groups.Count;
}
public override int RowsInSection(UITableView tableview, int group)
{
if (_groups == null)
return 0;
return _groups[group].Items.Count;
}
protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
{
UITableViewCell cell;
if (item is Item)
{
cell = MakeItemRow(tableView, (Item)item);
}
else
{
throw new ArgumentException("Unknown cell type " + item.GetType().Name);
}
return cell;
}
protected override object GetItemAt(NSIndexPath indexPath)
{
if (_groups == null)
return null;
return _groups[indexPath.Section].Items[indexPath.Row];
}
private UITableViewCell MakeHeaderRow(UITableView tableView, GroupCellViewModel group)
{
var existing = (GroupCellView)tableView.DequeueReusableCell(GroupCellView.Key);
if (existing != null)
return existing;
return new GroupCellView();
}
private UITableViewCell MakeItemRow(UITableView tableView, Item item)
{
var existing = (ItemCellView)tableView.DequeueReusableCell(ItemCellView.Key);
if (existing != null)
return existing;
return new ItemCellView();
}
}
我认为您的解决方案已经存在-但您需要提供一个GetViewForHeader
实现,该实现有点类似于MvvmCross提供的绑定GetCell
实现-请注意以下内容中的DataContext
设置:
public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
var item = GetItemAt(indexPath);
var cell = GetOrCreateCellFor(tableView, indexPath, item);
var bindable = cell as IMvxDataConsumer;
if (bindable != null)
bindable.DataContext = item;
return cell;
}
对于标题,您需要将DataContext
设置为组标题的适当“视图模型”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.