绑定viewModel属性以查看MvvmCross中的属性

时间:2014-01-17 10:11:25

标签: mvvmcross

我正在使用MvvmCross和SherlockActionBar。我的问题是我需要根据某些ViewModel属性的值在SherlockActionBar中创建项目。

actionBar中的项具有属性IsVisible但不幸的是它没有setter(你需要通过item.SetVisible(boolValue)设置可见性)所以我决定在View.cs中创建我自己的属性ItemVisible(将它绑定到将改变调用item.SetVisible。

的ViewModel属性

我已经在代码绑定和found this中搜索了如何操作。

所以我将ItemVisible View属性绑定到ViewModelProperty,但它从未进入ItemVisible setter。当然,在ViewModelProperty可以更改后,我在viewModel中引发了RaiseAllPropertyChanged。我调查了mvvmcross bindings,但我找不到问题的答案。我做错了什么?

    public class SomeView : BaseActionBarActivity {
    private IMenuItem _item ;

    private bool ItemVisible
    {
        get { return _item.IsVisible; }
        set { _item.SetVisible(value); }
    }

    protected override void OnCreate(Bundle bundle)
    {
        SetTheme(Resource.Style.Theme_Sherlock);
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.SomeView);

        var set = this.CreateBindingSet<SomeView, SomeViewModel>();
        set.Bind(this).For(p => p.ItemVisible).To(e => e.ViewModelProperty);
        set.Apply();
    }

    public override bool OnCreateOptionsMenu(Xamarin.ActionbarSherlockBinding.Views.IMenu menu)
    {
        SupportMenuInflater.Inflate(Resource.Menu.SomeMenu, menu);

        _item = menu.FindItem(Resource.Id.xmlMenuResource);
    }}

1 个答案:

答案 0 :(得分:2)

我猜这是由于private中的private bool ItemVisible - MvvmCross需要使用反射来调用此成员,并且由于CLR安全性,很难在private成员上执行此操作限制。

尝试:

public bool ItemVisible
{
    get { return _item.IsVisible; }
    set { _item.SetVisible(value); }
}

http://mvvmcross.blogspot.co.uk/中,N = 18和N = 28也涵盖了这个主题(我的NDC伦敦谈话https://speakerdeck.com/cirrious/data-bind-everything也有所涉及,但我担心还没有录制的视频!)