我想从一个活动转到另一个活动.我还在学习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中,我想将它绑定到NavigationView的事件,不再创建意图和诸如此类的东西.我怎么做到这一点?
我想在代码文件中使用流畅的绑定逻辑而不是在布局中,就像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是一个事件.我无法找到将事件绑定到命令的方法.在可能发生之前还有过滤ItemId的逻辑,所以它甚至不是一个简单的事件到命令绑定.
解决方法
由于没有为NavigationView定义绑定目标,因此您将无法绑定为
Cyriac describes in his post.
目标绑定在内部执行的操作只是订阅事件并对其作出反应并将该数据作为属性公开.
因此,由于目前无法获取ItemsSource并绑定到NavigationView,您必须执行类似于您已经执行的操作,将EventHandler挂接到事件,并直接调用viewmodel,即调用Command.这看起来像这样:
navigationView.NavigationItemSelected += ItemSelected; private void ItemSelected(object sender,NavigationItemSelectedEventArgs args) { viewmodel.NavigateCommand.Execute(args.MenuItem.TitleFormatted.ToString()); }
然后在命令中的viewmodel中:
private void DoNavigateCommand(string title) { if (title == "Derp") Showviewmodel<Derpviewmodel>(); }
或者,您可以将此代码包装在Target Binding中.你可以看到这些是如何实现的in the official MvvmCross github repository.