我正在开发一个使用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;
}
}
}
答案 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中设置的原型单元格。