设置:
> 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的逻辑,所以它甚至不是一个简单的事件到命令绑定.
我不确定这是否是正确的方法.我想要的只是将菜单点击绑定到代码文件中的命令而不是布局文件.
解决方法
目标绑定在内部执行的操作只是订阅事件并对其作出反应并将该数据作为属性公开.
因此,由于目前无法获取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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。