如何将工具栏 MenuItem.IsEnabled 与 MvvmCross 和 Xamarin.Android 绑定



使用 MvvmCross 和 Xamarin.Android 是否可以将工具栏菜单项的 IsEnabled 属性绑定到视图模型中的布尔值? 如果是这样,它是如何完成的?

我相信目前不可能将Android IMenuItem.IsEnabled绑定到视图模型上的布尔值,因为IsEnabled是只读的,并且更改菜单项的启用状态需要调用SetIsEnabled(bool)

我通过在活动/片段中添加一个用于MvxViewModel.PropertyChanged的事件处理程序来解决此限制。 我所有的视图模型都继承自MvxViewModel,所以我将分享一种可以实现此目的的方法。 我的大部分应用程序都是使用 Fragment 实现的,所以我的示例反映了这一点(在我的实际代码中,我将大部分内容放在一个基本的 Fragment 类中,但我想保持简单):

public class MyViewModel : MvxViewModel
{
public bool MenuItemIsEnabled {
get{return _menuItemIsEnabled;}
set{SetProperty(ref _menuItemIsEnabled, value);
}
}
[MvxFragment(typeof(MainViewModel), Resource.Id.content_frame, true)]
[Register(nameof(MyFragment))]
public class MyFragment : MvxFragment
{
private Toolbar Toolbar;
//menuitem whose enabled state should change with viewmodel property
private IMenuItem MyMenuItem;       
public new MyViewModel ViewModel
{
get { return (MyViewModel)base.ViewModel; }
set { base.ViewModel = value; }
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
var view = base.OnCreateView(inflater, container, savedInstanceState);
//we'll need the Toolbar later when we set up the IsEnabled "binding"
Toolbar = view.FindViewById<Toolbar>(Resource.Id.toolbar);
return view;
}
public override void OnViewModelSet()
{
base.OnViewModelSet();
ViewModel.PropertyChanged += ViewModel_PropertyChanged;
}
public override void OnCreateOptionsMenu(IMenu menu, MenuInflater inflater)
{
base.OnCreateOptionsMenu(menu, inflater);
//create the menu based on a menu resource
inflater.Inflate(Resource.Menu.my_menu, menu);
//save a reference to the menu item so we can update it when the viewmodel changes
MyMenuItem = menu.FindItem(Resource.Id.my_menu_item);
//set the initial enabled state based on the viewmodel
MyMenuItem.SetEnabled(ViewModel.MenuItemIsEnabled);
}
private void ViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
//when ViewModel.MenuItemIsEnabled is updated, update the menuitem enabled state as well
if (e.PropertyName == nameof(ViewModel.MenuItemIsEnabled ))
BinContentsMenuItem?.SetEnabled(ViewModel.MenuItemIsEnabled);
}
}

这应该被视为伪代码,因为它试图演示我用来解决原始问题的一般概念。

最新更新