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

问题描述 投票:8回答:1

我想使用MVVMCross,但是对于我的Android应用程序,我还想使用其他库(滑动菜单和操作栏),这需要我从他们的自定义类继承我的活动类。这使我无法继承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中有没有办法做到这一点?

xamarin.android xamarin mvvmcross
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以在EventSourceFooActivity中提供来自生命周期事件的事件
  • 继承自EventSourceFooActivity以在MvxFooActivity中提供datacontext
  • 然后,您可以在继承自MvxFooActivity的活动中编写代码

要查看所需的代码,请参阅:

你会在所有mvx改编的活动中看到相同的代码 - MvxActivity,MvxTabActivity,......这里有一些剪切和粘贴,但尽可能多的代码放在共享扩展方法中。

在以前的版本中,人们使用这种技术来绑定monogame和google广告活动 - 例如,请参阅Insert a Monogame view inside MvvmCross monodroid Activity

© www.soinside.com 2019 - 2024. All rights reserved.