如何将属性绑定到MvxViewModel中的数组的特定位置?

时间:2016-07-09 13:39:54

标签: xamarin xamarin.ios mvvmcross

假设我有一个带字符串数组属性的MvxViewModel:

customBinding

假设我还有一个带有单个字符串属性的iOS MvxViewController:

using System;
using Cirrious.MvvmCross.ViewModels;
namespace Foo {
    public class FooViewModel : MvxViewModel {
        private string[] mTexts;
        public string[] Texts {
            get { return mTexts; }
            set {
                mTexts = value;
                RaisePropertyChanged(() => Texts);
            }
        }
        public void Init()
        {
            Texts = new string[] { "foo", "bar" };
        }
    }
}

如何将此字符串属性using System; using Cirrious.MvvmCross.Touch.Views; using Cirrious.MvvmCross.Binding.BindingContext; namespace Foo { public class FooView : MvxViewController { public string Text { get; set; } public override void ViewDidLoad () { base.ViewDidLoad(); var bindset = this.CreateBindingSet<FooView, FooViewModel>(); bindset.Bind(Text).To("Texts[0]"); bindset.Apply(); } } } 绑定到Text数组的一个位置(例如0)?

我找到了来源(herehere),表明这可以通过上面的Texts方法完成,但是,我收到警告:{{ 1}}。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

您可以使用ListObservableCollection代替Array

private List<string> mTexts;
public List<string> Texts
{
    get { return mTexts; }
    set
    {
        mTexts = value;
        RaisePropertyChanged(() => Texts);
    }
}

我不确定Mvx support for Array type properties。我总是倾向于使用ObservableCollectionList。尝试绑定到Array时收到的错误消息似乎表明它正努力在Array上进行索引查找。

  

无法绑定:未在源[]

上找到源属性源IndexedProperty:0

我尝试过并且似乎工作的一种方法是在ViewModel中实现Indexer然后绑定到它。

<强> 视图模型

string[] mTexts;
public string this[int index] => mTexts[index];

public void Init()
{
    mTexts = new string[] { "foo", "bar" };
}

查看约束

var bindset = this.CreateBindingSet<FooView, FooViewModel>();
bindset.Bind(Text).To(".[1]");
bindset.Apply();

正如xleon在下面的评论中所指出的,这段时间是可选的。使用"[1]"也可以。

替代Lambda:

var bindset = this.CreateBindingSet<FooView, FooViewModel>();
bindset.Bind(Text).To(vm => vm[1]);
bindset.Apply();