【问题标题】:MvvmCross binding to table cell in a storyboardMvvmCross 绑定到情节提要中的表格单元格
【发布时间】:2015-06-02 01:00:28
【问题描述】:

我正在使用 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;
        }
    }
}

【问题讨论】:

  • 您是否按照 Stuart 的建议实现了此功能:stackoverflow.com/questions/16322879/…?一般来说,故事板不太适合 Mvvm 模式。我会坚持使用单独的 xib 文件,让您的视图模型处理所有导航。
  • @PkL728 视图模型正在处理导航。故事板仅包含视图的 UI,没有转场。 Stuart 在这里以更积极的方式绘制故事板:stackoverflow.com/questions/22126929/… 所使用的技术是他的第二个建议。
  • 您的主要问题可能与 XCode 有关。您的“myLabelName”是否正确暴露?您可以发布 MyCell 类的代码吗?
  • @PkL728 我已经为 MyCell 添加了代码。另外,我在“myLabelName”上犯了一个错误,它应该是“MyStringProperty”,它基本上是一个类中的公共字符串。所以“MyStringProperty”可以是姓名、电话号码或电子邮件中的任何一种。绑定时都会出现错误信息。
  • 你也可以发布你的 MyCell.designer.cs 吗?我在想也许奥特莱斯可能没有设置好?您的设置看起来与我正在运行的项目之一没有什么不同...

标签: ios xamarin mvvmcross


【解决方案1】:

我遇到了几乎相同的问题,但我找到了解决方案:

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

显然流畅的绑定和 Storyboard TableViewCells 不能很好地协同工作。 CollectionViewCells 也是如此(最终解决方案相同,但您不需要自定义 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

【讨论】:

  • pazi146 - 如果你能把它上传到 github,那就太好了。我遇到了同样的问题,看看完整的解决方案会很有用
【解决方案2】:

我遇到了同样的问题,在我的情况下,只需将 MvxTableViewSource 子类化并省略 RegisterClassForCellReuse 调用就可以了。似乎调用它会破坏 Storyboard 中设置的原型单元。

【讨论】:

    猜你喜欢
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多