MvvmCross绑定到故事板中的表格单元格

时间:2014-06-23 09:37:14

标签: ios xamarin mvvmcross

我正在开发一个使用MvvmCross的应用程序,该应用程序使用UI的故事板。我没有将XIB文件用于表格单元格,而是尝试从故事板中创建单元格。故事板生成了单元格的类,然后在我绑定到模型的类中。正在创建单元格,但在绑定到单元格中的每个标签时会发生以下错误,其中' MyStringProperty'是我试图绑定的属性的名称(姓名,电话号码或电子邮件):

Failed to create target binding for binding Text MyStringProperty

该表的创建方式与Stuart的Kitten Cell教程相同,只是使用以下代码行代替XIB,以表示使用生成的单元格类:

tableView.RegisterClassForCellReuse(typeof(MyCell), MyCell.Key);

单元格中数据的绑定也与Stuart的Kitten Cell教程中的方式相同。


以下是MyCell的代码

public partial class MyCell : MvxTableViewCell
{
    public static readonly NSString Key = new NSString("MyCell");

    public MyCell(IntPtr handle) : base(handle)
    {
        this.DelayBind(() =>
        {
            var set = this.CreateBindingSet<MyCell, ContactModel>();
            set.Bind(myLabelOne).To(contact => contact.Name);
            set.Bind(myLabelTwo).To(contact => contact.PhoneNumber);
            set.Bind(myLabelThree).To(contact => contact.Email);
            set.Apply();
        });
    }
}

设计师:

[Register ("MyCell")]
partial class MyCell
{
    [Outlet]
    MonoTouch.UIKit.UILabel myLabelOne{ get; set; }

    [Outlet]
    MonoTouch.UIKit.UILabel myLabelTwo{ get; set; }

    [Outlet]
    MonoTouch.UIKit.UILabel myLabelThree{ get; set; }

    void ReleaseDesignerOutlets ()
    {
        if (myLabelOne!= null) {
            myLabelOne.Dispose ();
            myLabelOne= null;
        }

        if (myLabelTwo!= null) {
            myLabelTwo.Dispose ();
            myLabelTwo= null;
        }

        if (myLabelThree!= null) {
            myLabelThree.Dispose ();
            myLabelThree= null;
        }
    }
}

2 个答案:

答案 0 :(得分:4)

我有同样的问题,但我找到了解决方案:

此处的解决方案(我的问题 - 编辑非常重要):https://stackoverflow.com/questions/24507192/mvvmcross-ios-storyboard-table-binding-not-working

明显流畅的绑定和故事板TableViewCell不能很好地协同工作。 CollectionViewCell的情况也是如此(最后是相同的解决方案,但您不需要自定义MvxCollectionViewSource - 标准就可以了)

@stuart可能知道更好,为什么这两种方法产生不同的结果

将您的单元格更改为:

public partial class MyCell : MvxTableViewCell
{
    public static readonly NSString Key = new NSString("MyCell");
    private const string BindingText = @"
MyLabelOneText Name;
MyLabelTwoText PhoneNumber;
MyLabelThreeText EMail";

    public string MyLabelOneText
    {
        get { return myLabelOne.Text; }
        set { myLabelOne.Text = value; }
    }

    public string MyLabelTwoText
    {
        get { return myLabelTwo.Text; }
        set { myLabelTwo.Text = value; }
    }

    public string MyLabelThreeText
    {
        get { return myLabelThree.Text; }
        set { myLabelThree.Text = value; }
    }

    public MyCell(IntPtr handle) : base(BindingText, handle)
    {
    }
}

您可能还想使用自定义TableViewSource(或覆盖单元格中必要的构造函数):

public class MyTableViewSource : MvxTableViewSource
{
    private NSString cellIdentifier = new NSString("MyCell");

    public MyTableViewSource(UITableView tableView)
        : base(tableView)
    {
    }

    protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
    {
        return (MyCell)tableView.DequeueReusableCell(cellIdentifier);
    }
}

根据您的需要调整所有内容,唯一重要的部分是调用基础构造函数MvxTableViewCell(bindingText, handle)

如果需要,我可以将项目上传到GitHub

答案 1 :(得分:2)

我有同样的问题,在我的例子中,简单地继承MvxTableViewSource并省略了RegisterClassForCellReuse调用。似乎调用它会破坏在Storyboards中设置的原型单元格。