需要mvvmcross数据绑定帮助

时间:2013-02-04 04:04:03

标签: data-binding uitableview xamarin.ios mvvmcross

尝试了解mvvmcross和xib编辑器 - 我已经按照

中的示例代码进行了操作

http://slodge.blogspot.co.uk/2013/01/uitableviewcell-using-xib-editor.html

并在我的代码中加入了一些内容。

 namespace ConX.UI.Touch.Cells
 { 
 [Register("JobCell")]
    public partial class JobCell : MvxBaseBindableTableViewCell
    {
    public static NSString Identifier = new NSString("JobCell");
    public const string BindingText = @"{'JobDescription':{'Path':'Description'}, 'JobScheduledForDate':{'Path':'ScheduledForDate'}, 'JobNumber':{'Path':'JobNo'}}";


    public JobCell(): base(BindingText)
    {
    }

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

    public JobCell (string bindingText): base(bindingText, UITableViewCellStyle.Default, Identifier)
    {
    }

    public string JobDescription 

    {
        get { return this.DescriptionLabel.Text; }
        set { this.DescriptionLabel.Text = value; }
    }


    public string JobScheduledForDate
    {
        get { return ScheduledForDateLabel.Text; }
        set { ScheduledForDateLabel.Text = value; }
    }


    public string JobNumber
    {
        get { return NumberLabel.Text; }
        set { NumberLabel.Text = value; }
    }

}

}

using MonoTouch.Foundation;

namespace ConX.UI.Touch.Cells
{
partial class JobCell
{
    [Outlet]
    MonoTouch.UIKit.UILabel DescriptionLabel { get; set; }

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

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

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

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

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

}

我无法通过抛出以下错误来完成此工作 - 似乎没有创建出口?

System.NullReferenceException: Object reference not set to an instance of an object
at ConX.UI.Touch.Cells.JobCell.set_JobDescription (System.String value) [0x00008] in
/Volumes/ConXPrototype/Conx.UI.Touch/Cells/JobCell.cs:32
at    
       ConX.UI.Touch.Views.BaseJobListView`2+TableSource[ConX.Core.ViewModels.JobListViewModel,Syst
em.DateTime].GetOrCreateCellFor (MonoTouch.UIKit.UITableView tableView,
MonoTouch.Foundation.NSIndexPath indexPath, System.Object item) [0x00025] in  
/Volumes/ConXPrototype/Conx.UI.Touch/Views/BaseJobListView.cs:101
at Cirrious.MvvmCross.Binding.Touch.Views.MvxBaseBindableTableViewSource.GetCell  
(MonoTouch.UIKit.UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath) 
[0x00000] in <filenam

exception

非常感谢 克恩

1 个答案:

答案 0 :(得分:1)

我猜你正在运行旧版本的MvvmCross框架二进制文件。

我们在过去4周内进行了一些关键更改,这些更改延迟了数据绑定的发生,直到细胞和来源真正可用于绑定。您可以在Bindable Cell changes on GitHub

看到这些更改

有两种可能的解决方法:

A。升级到更新的程序集 - 记录该博客帖子时使用的程序集在https://github.com/slodge/MvvmCross-Tutorials/tree/master/Lib/MvvmCross(或当前在http://slodge.blogspot.co.uk/p/mvvmcross-binaries_7.html上发布的二进制文件)

B。 继续使用较旧的程序集,但您需要通过测试以下空控件来保护您的get / set方法:

public string JobNumber
{
    get { return NumberLabel == null ? null : NumberLabel.Text; }
    set { if (NumberLabel == null) return; NumberLabel.Text = value; }
}

对于库中的这一变化感到抱歉 - MvvmCross确实在不断改进,样本/博客文章并不总是赶上来,这可能会导致样本混淆。


如果您选择更新到最新的程序集,那么Swiss Binding语法也将可用,允许您切换:

public const string BindingText = @"{
   'JobDescription':{'Path':'Description'}, 
   'JobScheduledForDate':{'Path':'ScheduledForDate'}, 
   'JobNumber':{'Path':'JobNo'}}";

public const string BindingText = @"
   JobDescription Description; 
   JobScheduledForDate ScheduledForDate; 
   JobNumber JobNo";

但这只是一个选项 - 如果您愿意,可以坚持使用JSON。

有关Swiss Binding的更多信息,请参阅http://blog.ostebaronen.dk/2013/01/awesome-mvvmcross-swiss-bindings-for.html