在MvvmCross中将viewModel属性绑定到view属性

3
我正在使用MvvmCross和SherlockActionBar。我的问题是,根据某些ViewModel属性的值,我需要使SherlockActionBar中的项目消失。
在actionBar中的项目有IsVisible属性,但不幸的是它没有setter(您需要通过item.SetVisible(boolValue)设置可见性),因此我决定在View.cs中创建自己的属性ItemVisible(将其绑定到ViewModel-property),当它改变时调用item.SetVisible。
我已经搜索了如何在代码绑定中执行此操作并找到了这个
所以我将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个回答

2
我猜这是由于private bool ItemVisible中的private导致的 - MvvmCross需要使用反射调用此成员,并且由于CLR安全限制,难以对private成员进行操作。

请尝试:

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

这个话题在N=18和N=28也有一些涉及,可以在http://mvvmcross.blogspot.co.uk/上找到相关内容(并且在我在NDC伦敦的演讲中也有涉及:https://speakerdeck.com/cirrious/data-bind-everything,但恐怕还没有视频记录!)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接