Xamarin MvvmCross MvxAppCompatDialogFragment松开BindingContext

时间:2018-12-21 08:20:40

标签: xamarin xamarin.android mvvmcross

我在整个项目中一直使用MvxAppCompatActivity,但是在这种情况下,我必须使用MvxAppCompatDialogFragment

不幸的是,在这种情况下,我以某种方式丢失了ViewModel的绑定上下文。

MobileTestView

[MvxDialogFragmentPresentation]
[Register(nameof(MobileScreenTestView))]
public class MobileTestView : MvxAppCompatDialogFragment<MobileTestViewModel>
...
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        return inflater.Inflate(Resource.Layout.mobile_screen, container, false);
    }
...

MobileTestViewModel

public class MobileTestViewModel : MvxViewModel<MInput, MResult>
...
public string Instructions { get; set; } = "Instructions";
...

mobile_screen.axml

...
<TextView
    android:id="@+id/text_mobile"
    android:layout_width="match_parent"
    android:layout_height="44dp"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:gravity="center_vertical|center_horizontal"
    tools:text="Scan"
    local:MvxBind="Text Instructions" />
...

local:MvxBind="Text Instructions"不再起作用,但是我已经检查了它,并在进入OnCreateView()之前在视图模型中对其进行了设置。

上面的代码对于MvxAppCompatActivity来说很好用。

如果我无法做的事情,我总是可以这样做

view.FindViewById<TextView>(Resource.Id.text_mobile).Text = ViewModel.Instructions;

并不是我真的需要使用local:MvxBind,但是我想知道我在做什么错。

更新-对于存在相同问题的任何人:

OnCreateView方法更改为:

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    base.OnCreateView(inflater, container, savedInstanceState);

    return this.BindingInflate(Resource.Layout.mobile_screen, container, false);
}

,并且您的BindingContext可以正常工作。

1 个答案:

答案 0 :(得分:1)

您已经注意到自己,必须使用this.BindingInflate代替LayoutInflater中的OnCreateView参数。这是因为我们无法在MvvmCross中拦截Fragment生命周期来提供自己的Layout Inflater。

BindingInflate的作用是遍历视图层次结构,查找在视图Text Instructions中应用到视图的所有自定义属性,并将这些绑定应用于View和ViewModel之间。

因此,每当使用Fragments时,都应使用BindingInflate。