【问题标题】:MVVMCross for android - how to do binding in code?MVVMCross for android - 如何在代码中进行绑定?
【发布时间】:2013-05-23 21:34:06
【问题描述】:

我想使用 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】:

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

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

    您需要使用FindViewById&lt;Type&gt;() 获取对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 中提供数据上下文
    • 然后您可以在继承自 MvxFooActivity 的活动中编写代码

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

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

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

    【讨论】:

    • 嗨 Stuart,我正在尝试第一种方法,但它在 Bind() 调用上给出了 null ref 异常。我从 Activity、IMvxBindingContextOwner、IMvxLayoutInflater、IMvxView 继承我的活动,并自己创建绑定上下文和视图模型。注意,由于不能从MvxActivity继承,所以不能调用this.CreateBindingSet,还得自己创建MvxAndroidBindingContext。知道有什么问题吗?我试图通过编译 MVVMCross 源代码来查看发生了什么也失败了,VS 说它无法加载 system.windows.dll 程序集,尽管我删除了 Cirrious.CrossCore 中的 ref
    • 最后一条评论中有太多问题/cmets。我将在我的回答中更改“替代”。对于该评论中的其他所有内容,我不会参与评论对话 - stackoverflow 对这些皱眉。
    猜你喜欢
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多