加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – MVVMCross:如何将Xamarin.Android事件绑定到ViewModel命

发布时间:2020-12-15 08:15:48 所属栏目:百科 来源:网络整理
导读:我想从一个活动转到另一个活动.我还在学习MVVMCross,所以整个模式对我来说还是很新的.我现在只在Xamarin. Android上应用它. 设置: MainDashboardActivity有一个Android设计支持库的NavigationView. ViewModel MainDashboardViewModel有一个IMvxCommand GoTo
我想从一个活动转到另一个活动.我还在学习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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读