MVVMCross:如何将Xamarin.Android事件绑定到ViewModel命令

bat*_*and 7 c# xamarin.android mvvmcross xamarin

我想从一个活动转到另一个活动.我还在学习MVVMCross,所以整个模式对我来说还是很新的.我现在只在Xamarin.Android上应用它.

设置:

  1. MainDashboardActivity 有一个Android设计支持库 NavigationView.

  2. ViewModel MainDashboardViewModel有一个对另一个活动来说IMvxCommand GoToSecondDashboard很简单ShowViewModel.

NavigationView具有NavigationItemSelected事件.通常,我会这样做:

navigationView.NavigationItemSelected += (o, e) =>
{
    if(e.MenuItem.ItemId == Resource.Id.SecondDashboardMenu)
    {
        // make new intent to target activity
    }
};
Run Code Online (Sandbox Code Playgroud)

现在我已将导航逻辑隐藏到ViewModel的IMvxCommand中,我想将它绑定到NavigationView的事件,不再创建意图和诸如此类的东西.我怎么做到这一点?

我想在代码文件中使用流畅的绑定逻辑而不是在布局中,就像这个答案的作用一样:

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()
}
Run Code Online (Sandbox Code Playgroud)

但这NavigationItemSelected是一个事件.我无法找到将事件绑定到命令的方法.在可能发生之前还有过滤ItemId的逻辑,所以它甚至不是一个简单的事件到命令绑定.

我不确定这是否是正确的方法.我想要的只是将菜单点击绑定到代码文件中的命令而不是布局文件.

Che*_*ron 6

由于没有定义绑定目标NavigationView,因此无法按照Cyriac在其帖子中描述的方式进行绑定.

目标绑定在内部执行的操作只是订阅事件并对其作出反应并将该数据作为属性公开.

因此,由于没有办法接受ItemsSource并绑定到NavigationView当前,你必须做一些像你已经做的事情,挂EventHandler到一个event,并直接ViewModel调用你的,即调用一个命令.这看起来像这样:

navigationView.NavigationItemSelected += ItemSelected;

private void ItemSelected(object sender, NavigationItemSelectedEventArgs args)
{
    ViewModel.NavigateCommand.Execute(args.MenuItem.TitleFormatted.ToString());
}
Run Code Online (Sandbox Code Playgroud)

然后在你ViewModel的你的Command:

private void DoNavigateCommand(string title)
{
    if (title == "Derp")
        ShowViewModel<DerpViewModel>();
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以将此代码包装在Target Binding中.您可以在官方MvvmCross github存储库中看到它们是如何实现.