无法绑定到mvvmcross中的ios表节单元格,子单元格按预期绑定

时间:2014-07-17 14:57:16

标签: c# ios xamarin mvvmcross

我尝试使用分组部分创建一个TableView:

TableView with sections

我将组列表绑定到表中。一个组包含一些字符串属性和一个项列表,而一个项也包含一些字符串属性。组和项单元格各自都有自己的类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();
            }
        }

1 个答案:

答案 0 :(得分:4)

我认为您的解决方案几乎就在那里 - 但您需要提供一个GetViewForHeader实现,这有点像MvvmCross提供的绑定GetCell实现 - 请注意{{1设置在:

DataContext

来自https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Binding.Touch/Views/MvxBaseTableViewSource.cs#L97

对于标题,您需要将 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;对于组头。