我在整个项目中一直使用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可以正常工作。
答案 0 :(得分:1)
您已经注意到自己,必须使用this.BindingInflate
代替LayoutInflater
中的OnCreateView
参数。这是因为我们无法在MvvmCross中拦截Fragment生命周期来提供自己的Layout Inflater。
BindingInflate的作用是遍历视图层次结构,查找在视图Text Instructions
中应用到视图的所有自定义属性,并将这些绑定应用于View和ViewModel之间。
因此,每当使用Fragments时,都应使用BindingInflate。