MVVMCross for Android - 如何在代码中进行绑定?

8

我希望使用MVVMCross,但对于我的Android应用程序,我还想使用其他库(侧滑菜单和操作栏),需要我从它们的自定义类继承我的activity类。这阻止了我继承MvxActivity,但我注意到在MVVMCross for iOS中,您可以在代码中执行所有绑定(请参见https://github.com/slodge/NPlus1DaysOfMvvmCross/blob/master/N-00-FirstDemo/FirstDemo.Touch/Views/FirstView.cs

var set = this.CreateBindingSet<FirstView, FirstViewModel>();
set.Bind(textEditFirst).To(vm => vm.FirstName);
set.Bind(textEditSecond).To(vm => vm.LastName);
set.Bind(labelFull).To(vm => vm.FullName);
set.Apply();

有没有在Android中实现这个的方法?
1个回答

11

如果您愿意,可以在Android中使用流畅的绑定。

完全相同的代码应该能够工作。

您需要使用 FindViewById<Type>() 获取对UI控件的引用,然后可以对它们进行绑定。

例如,在TipCalc中,您可以添加标识控件,如下所示:

<EditText
    android:id="@+id/FluentEdit"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:textSize="24dp"
    android:gravity="right"
    />

然后使用以下方法实现绑定:

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()
}

此外,您可以通过以下步骤将任何FooActivity转换为数据绑定MvxFooActivity:
  • 从FooActivity继承以提供来自事件源FooActivity中的生命周期事件
  • 从EventSourceFooActivity继承以在MvxFooActivity中提供数据上下文
  • 然后,您可以在从MvxFooActivity继承的活动中编写代码
要查看所需的代码,请参见: 您将在所有mvx适配的活动中看到相同的代码 - MvxActivity、MvxTabActivity等。这里有一点剪切和粘贴,但尽可能多的代码放在共享的扩展方法中。
在以前的版本中,人们使用此技术来绑定monogame和google广告活动 - 例如,请参见Insert a Monogame view inside MvvmCross monodroid Activity

1
嗨 Stuart,我正在尝试第一种方法,但在Bind()调用时它会产生空引用异常。我从Activity、IMvxBindingContextOwner、IMvxLayoutInflater、IMvxView继承我的活动,并自己创建绑定上下文和viewmodel。请注意,由于我无法从MvxActivity继承,因此无法调用this.CreateBindingSet,我还必须自己创建MvxAndroidBindingContext。你有什么想法吗?我试图通过编译MVVMCross源代码来了解发生了什么,但失败了,VS表示它无法加载system.windows.dll程序集,尽管我删除了Cirrious.CrossCore中的ref。 - Sinh Pham
上一个评论中有太多的问题/评论。我会在我的回答中将“alternatively”更改为“additionally”。至于评论中的其他内容,我不想进行评论交流——stackoverflow 不赞成这样做。 - Stuart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接