MvxTableViewCell加载一个空视图

时间:2017-07-07 13:34:33

标签: c# ios uitableview xamarin mvvmcross

根据项目类型,我需要一个具有不同单元格的自定义iOS TableView。看起来很简单,只需在TableViewSource构造函数中定义布局,即MvxTableViewSource的子代。注册如下:

public TableViewSource(UITableView tableView, List<ItemHolder> sections) : base(tableView) {
    tableView.RegisterClassForCellReuse(typeof(MyCell), "MyCellId");
    [Registering further types here]
}

为了处理部分,我创建了一个ItemHolder来定义部分中的项目,以及部分页眉/页脚。那部分工作正常。

在GetOrCreateCellFor中,我根据给定项目的类型使用默认的DequeueReusableCell。但是,如果我如上所述注册单元格,则会绘制一个空单元格。

我的单元格使用XIB + Backing类(基于MvxTableViewCell)方式,理论上应该可以正常工作。如果我使用它的Nib属性,并使用RegisterNibForCellReuse,则会绘制内容(但是行高是错误的,并且由于它在支持类中定义,因此不会发生绑定。)

该课程如下:

public partial class MyCell : MvxTableViewCell
{
    public static readonly NSString Key = new NSString("MyCell");
    public static readonly UINib Nib = UINib.FromName("MyCell", NSBundle.MainBundle);

    protected MyCell(IntPtr handle) : base(handle)
    {
        this.DelayBind(() =>
        {
            var binding = this.CreateBindingSet<MyCell, object>();
            binding.Bind(this.TextView.Text).To(vm => vm.GetType().Name).WithConversion(new StringFormatConverter(), "Unknown cell type: {0}");
            binding.Apply();
        });
    }

    public static MyCell Create()
    {
        return (MyCell)Nib.Instantiate(null, null)[0];
    }
}

在XIB中,我有一个使用AutoLayout设置的UILabelView,它有一个名为TextView的Outlet。

所以基本上如果我通过类本身添加它,它根本不起作用。如果我使用Nib,那么布局工作,但没有绑定,datacontext等,从技术上讲,我的逻辑已经消失。

我在这里做错了什么,或者这甚至都没有用?

1 个答案:

答案 0 :(得分:1)

立即突出的一件事是定义绑定的方式。您不需要绑定TextView.Text,只需传入TextView:

binding.Bind(TextView).To(vm => vm.GetType().Name).WithConversion(new StringFormatConverter(), "Unknown cell type: {0}");

这个修复可能会让一切都适合你。否则,这对于我在MvvmCross中对XIB文件中定义的单元格布局有用:

1。)我使用RegisterNibForCellReuse注册我的单元格。

2.)而不是在构造函数中使用this.DelayBind(() =>。我在AwakeFromNib覆盖:

中进行绑定
public override void AwakeFromNib()
{
    base.AwakeFromNib();

    var binding = this.CreateBindingSet<MyCell, MyCellViewModel>();
    binding.Bind(TextView).To(vm => vm.GetType().Name).WithConversion(new StringFormatConverter(), "Unknown cell type: {0}");
    binding.Apply();
}