我正在尝试从一项事件转到另一项事件。我仍在学习 MVVMCross,所以整个模式对我来说还是很新鲜。我目前仅将其与 Xamarin.Android 一起应用。
设置:
MainDashboardActivity
有一个 Android 设计支持库的NavigationView。
ViewModel
<MainDashboardViewModel
有一个IMvxCommand GoToSecondDashboard
,这只是另一个事件的简单ShowViewModel
。
NavigationView 有一个 NavigationItemSelected 事件。通常,我会这样做:
navigationView.NavigationItemSelected += (o, e) =>
{
if(e.MenuItem.ItemId == Resource.Id.SecondDashboardMenu)
{
// make new intent to target activity
}
};
现在我已将导航逻辑塞入 ViewModel 的 IMvxCommand,我想将其绑定(bind)到 NavigationView 的事件,不再创建意图和诸如此类的东西。我将如何实现这一点?
我想在代码文件中而不是在布局中使用流畅的绑定(bind)逻辑,就像this answer做:
protected override void OnViewModelSet()
{
SetContentView(Resource.Layout.View_Tip);
var edit = this.FindViewById<EditText>(Resource.Id.FluentEdit);
var set = this.CreateBindingSet<TipView, TipViewModel>();
set.Bind(edit).To(vm => vm.SubTotal);
set.Apply();
// for non-default properties use 'For':
// set.Bind(edit).For(ed => ed.Text).To(vm => vm.SubTotal);
// you can also use:
// .WithConversion("converter", "optional parameter")
// .OneTime(), .OneWay() or .TwoWay()
}
但是 NavigationItemSelected
是一个事件。我一直无法找到将事件绑定(bind)到命令的方法。还有在此之前过滤 ItemId 的逻辑,因此它甚至不会是一个简单的事件到命令绑定(bind)。
我不确定这是否是正确的方法。我只想将菜单点击绑定(bind)到代码文件而不是布局文件中的命令。
最佳答案
由于没有为 NavigationView
定义绑定(bind)目标,您将无法绑定(bind)为 Cyriac describes in his post .
目标绑定(bind)在内部所做的只是简单地订阅一个事件并对其使用react并将该数据公开为一个属性。
因此,由于目前无法获取 ItemsSource
并绑定(bind)到 NavigationView
,因此您必须像您已经在做的那样, Hook EventHandler
到 event
,并直接调用您的 ViewModel
,即调用命令。这看起来像这样:
navigationView.NavigationItemSelected += ItemSelected;
private void ItemSelected(object sender, NavigationItemSelectedEventArgs args)
{
ViewModel.NavigateCommand.Execute(args.MenuItem.TitleFormatted.ToString());
}
然后在 Command
中的 ViewModel
中:
private void DoNavigateCommand(string title)
{
if (title == "Derp")
ShowViewModel<DerpViewModel>();
}
或者,您可以将此代码包装在目标绑定(bind)中。你可以看到这些是如何实现的 in the official MvvmCross github repository .
关于c# - MVVMCross:如何将 Xamarin.Android 事件绑定(bind)到 ViewModel 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37876554/