我尝试使用分组部分创建一个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();
});
主视图中的My TableSource扩展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();
}
}
答案 0 :(得分:4)
我认为您的解决方案几乎就在那里 - 但您需要提供一个GetViewForHeader
实现,这有点像MvvmCross提供的绑定GetCell
实现 - 请注意{{1设置在:
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;
}
设置为适当的&#34;视图模型&#34;对于组头。