我正在使用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);
}}
答案 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也有所涉及,但我担心还没有录制的视频!)