【问题标题】:Is two-way binding supported on MVVMCross for Touch? (besides UITextFields)MVVMCross for Touch 是否支持双向绑定? (除了 UITextFields)
【发布时间】:2013-06-18 15:16:05
【问题描述】:

我正在研究为什么我的 2-way 绑定无法用于使用 MVVMCross 进行 iOS 开发的原因。我正在使用嵌入到 tableView 的自定义单元格中的 UITextViews。

我看过这个问题:

How do I do two-way binding to a UITextView control using mvvmcross?

并且提到了如何在 Vnext 中不支持与 UITextViews 的 2 向绑定,但它与 V3 (Hot Tuna) 处于测试阶段。我正在使用热金枪鱼,并得到了二进制文件。 6 月 12 日。

以下代码行是我绑定单元格的方式。

this.CreateBinding (_cells[2]).For (cll => cll.FieldDescription).To ((TimesheetViewModel vm) => vm.AccountID).Mode(MvxBindingMode.TwoWay).Apply ();

_cells[] 是自定义类单元的数组

这是我的自定义单元格类中 FieldDescription 的属性:(FieldDescriptionLabel 是我的 UITextView)

    public string FieldDescription
    {
        get
        { 
            return FieldDescriptionLabel.Text;
        }
        set 
        {
            FieldDescriptionLabel.Text = value;
        }
    }

我的 UITextView 以一种方式绑定;我确实看到了从我的 viewModel 填充的信息,但是当我在 UITextView 中更改某些内容时,ViewModel 不会反映这些更改。

所以主要问题是:2 路绑定是否适用于 MVVMCross Hot Tuna 中的 UITextView?如果是,对我在实施中做错了什么有什么想法吗?

欣赏!

【问题讨论】:

    标签: mvvmcross


    【解决方案1】:

    为了使双向绑定起作用,mvvmcross 需要知道 ui 值何时发生变化。

    有几种方法可以做到这一点。

    根据您当前的设置,也许最简单的方法是将public event EventHandler FieldDescriptionChanged 添加到您的单元格,并确保每次文本视图更改时都会触发此事件 - 例如用类似的代码。

    public event EventHandler FieldDescriptionChanged;
    
    public string FieldDescription
    {
        get
        { 
            return FieldDescriptionLabel.Text;
        }
        set 
        {
            FieldDescriptionLabel.Text = value;
        }
    }
    
    public override void AwakeFromNib()
    {
        base.AwakeFromNib();
    
        FieldDescriptionLabel.Changed += (s,e) => {
            var handler = FieldDescriptionChanged;
            if (handler != null) 
                handler(this, EventArgs.Empty);
        };
    }
    

    或者,您可以尝试将您的单元格基于具有固有DataContextMvx 表格视图单元格。如果你这样做,那么你可以直接绑定到UITextView,然后在单元格的上下文中使用数据绑定。

    N+1 教程中展示了这种方法 - 例如在 N=6.5 - http://slodge.blogspot.co.uk/2013/05/n6-books-over-network-n1-days-of.html 中 - 单元格以如下构造函数结束:

    public BookCell (IntPtr handle) : base (handle)
    {
        _loader = new MvxImageViewLoader(() => MainImage);
    
        this.DelayBind(() => {
            var set = this.CreateBindingSet<BookCell, BookSearchItem> ();
            set.Bind(TitleLabel).To (item => item.volumeInfo.title);
            set.Bind (AuthorLabel).To (item => item.volumeInfo.authorSummary);
            set.Bind (_loader).To (item => item.volumeInfo.imageLinks.thumbnail); 
            set.Apply();
        });
    }
    

    使用这种方法,您只需绑定单元格的数据上下文 - 例如类似:

       this.CreateBinding (_cells[2]).For (cll => cll.DataContext).To ((TimesheetViewModel vm) => vm).TwoWay().Apply ();
    

    【讨论】:

    • 我在标记我自己的事件,但我没有意识到如果我将它命名为“FieldDescriptionChanged”,2-way 会起作用。在问这个问题之前我的修复是标记一个“FieldChanged”事件,然后监控它并手动更新我的 ViewModel。
    猜你喜欢
    • 2017-08-07
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多