c# - MVVMCross:如何将 Xamarin.Android 事件绑定(bind)到 ViewModel 命令

标签 c# xamarin xamarin.android mvvmcross

我正在尝试从一项事件转到另一项事件。我仍在学习 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
    }
};

现在我已将导航逻辑塞入 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 EventHandlerevent,并直接调用您的 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/

相关文章:

c# - 将类的属性映射到接口(interface)

c# - 向自动生成的代码添加属性

xamarin - 使用 Xamarin 实现 ARCore

xamarin - 在使用 --aot-only 运行时尝试 JIT 编译方法 (....)

xamarin - 如何使用Activity属性android :showForAllUsers in Xamarin?

c# - 根 Android shell 使用 Runtime().Exec ("command"卡在 ReadLine() 上)

c# - 使用 MiniProfiler 直接调用 ADO.net

ios - Xamarin Profiler 未显示在 Visual Studio 2017 中的“分析”选项卡下

android - 为什么这个 xamarin android 菜单文本没有显示?

javascript - 在 Angular 中将对象数组传递给 POST