xamarin.android - MVVMCross for android - 如何在代码中进行绑定(bind)?

标签 xamarin.android xamarin mvvmcross

我想使用 MVVMCross,但是对于我的 android 应用程序,我还想使用其他库(滑动菜单和操作栏),这需要我从他们的自定义类继承我的事件类。这使我无法继承 MvxActivity,但我注意到在 MVVMCross for iOS 中,您可以在代码中完成所有绑定(bind)(参见 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中做到这一点?

最佳答案

是的 - 如果你愿意,你可以在 Android 中使用流畅的绑定(bind)。

完全相同的代码应该可以工作。

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

例如,在 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"
    />

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

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 转换为数据绑定(bind) MvxFooActivity:
  • 从 FooActivity 继承以在 EventSourceFooActivity
  • 中提供来自生命周期事件的事件
  • 从 EventSourceFooActivity 继承以在 MvxFooActivity
  • 中提供数据上下文
  • 然后,您可以在继承自 MvxFooActivity
  • 的事件中编写代码

    要查看所需的代码,请参阅:
  • https://github.com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Droid.Fragging/MvxEventSourceFragmentActivity.cs
  • https://github.com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Droid.Fragging/MvxFragmentActivity.cs

  • 您将在所有 mvx 改编的事件中看到相同的代码 - MvxActivity、MvxTabActivity...这里有一点剪切和粘贴,但尽可能多的代码放在共享扩展方法中。

    在以前的版本中,人们使用这种技术来绑定(bind) monogame 和 google ads 事件 - 例如参见 Insert a Monogame view inside MvvmCross monodroid Activity

    关于xamarin.android - MVVMCross for android - 如何在代码中进行绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16724278/

    相关文章:

    xamarin - 如何使我的应用程序与智能电视兼容?

    c# - 获取数组 JSON.Net 的长度

    javascript - WebView.Eval 不在我的 HTML 中调用 javascript 函数 - Xamarin Forms

    ios - 将 Google 移动分析与 MVVMCross 集成

    xamarin.forms - Google Play 要求反混淆 txt 文件,Xamarin Forms

    c# - 如何通过 Xamarin.Android 中的单个 Activity 通过单击按钮在 View 之间导航?

    如果在处理时单击,Android 模拟器会崩溃

    c# - Xamarin 商店信息

    MvvmCross 检测 RequestClose 或后退按钮按下

    mvvmcross - MvvmCross,Mvx.MvxListView和MvxItemTemplate中的自定义绑定(bind)