【问题标题】:Binding Android.Views.View with ViewModel with MvvmCross on Android在 Android 上使用 MvvmCross 将 Android.Views.View 与 ViewModel 绑定
【发布时间】:2016-04-27 23:32:42
【问题描述】:

我正在尝试绑定在 Android 版 MapView 中单击标记时出现的信息内容窗口。

我创建了一个自定义管理器类,它采用 ItemSource 和 MapView (ObservableCollection),并在集合更改时在地图上添加标记。

现在我想绑定GetInfoContents(Marker marker)生成的InfoContent窗口

目前我不得不手动检索填充字段,如下所示,但我希望这些字段直接在布局中与当前 ViewModel 进行数据绑定

public override Android.Views.View GetInfoContents(object item, Marker marker)
        {
            var vm = item as DetailCalloutViewModel;
            if (vm != null) {
                var view = _layoutInflater.Inflate(Resource.Layout.view_store_marker_info_window, null);
                var address = view.FindViewById<TextView>(Resource.Id.address);
                var description = view.FindViewById<TextView>(Resource.Id.description);
                var badge = view.FindViewById<TextView>(Resource.Id.badge);

                address.Text = vm.Address;
                description.Text = vm.Location.Description;
                badge.Text = vm.BadgeNumber;
                return view;
            }

            return null;
        } 

【问题讨论】:

    标签: xamarin xamarin.android mvvmcross


    【解决方案1】:

    你应该试试 BindingContext 中的BindingInflate

    var view = this.BindingInflate(Resource.Layout.SomeLayout, null);
    

    更新:对于您的问题,我不确定这是否过于 hacky,但您可以在 MainActivity 中使用 Mvx.RegisterSingleton(BindingContext);,然后通过 var bindingContext = Mvx.Resolve&lt;IMvxBindingContext&gt;(); 解决此问题。


    替代方案:您可以订阅您的 vm.PropertyChanged 事件并自行处理更改 - 实际上是编写您自己的 BindingContext。

    【讨论】:

    • 我有一个管理器,它将来自不同类的可观察集合中的标记数据绑定。该类的签名是public abstract class BaseMapViewDataBindingSource: Java.Lang.Object, IOnMapReadyCallback, GoogleMap.IInfoWindowAdapter 和这个。 BindingInflate 无法从那里获得
    • 好的,我明白了问题所在。我更新了一点,但不是很开心。没有 BindingContext 就不能使用 MvvmCross Binding。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    相关资源
    最近更新 更多