MVVMCross for Touch 支持双向绑定吗? (除了 UITextFields)

2024-04-09

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

我看过这个问题:

如何使用 mvvmcross 双向绑定到 UITextView 控件? https://stackoverflow.com/questions/15839310/how-do-i-do-two-way-binding-to-a-uitextview-control-using-mvvmcross

并且提到了 Vnext 中不支持与 UITextViews 的 2 路绑定,但它在 V3 (Hot Tuna) 中处于测试阶段。我正在使用 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 需要知道 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);
    };
}

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

这种方法在 N+1 教程中有所展示 - 例如 N=6.5 -http://slodge.blogspot.co.uk/2013/05/n6-books-over-network-n1-days-of.html 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 ();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVVMCross for Touch 支持双向绑定吗? (除了 UITextFields) 的相关文章

随机推荐