我正在使用MvxFrameControl重用MyAccountView中的AddressView。
<!-- MyAccountView.axml -->
<MvxFrameControl
android:layout_width="match_parent"
android:layout_height="wrap_content"
local:MvxBind="DataContext EditAddressViewModel"
local:MvxTemplate="@layout/editaddressview"
android:id="@+id/EditAddressView" />
在MyAccountView的android片段MyAccountFragment中,我要访问MvxFrameControl引用的布局中包含的EditText。
<!-- EditAddressView.axml -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/SingleLineEditIconHeight"
local:MvxBind="Visibility Visibility(IsExpanded)">
<EditText
android:id="@+id/Address1"
style="@style/EditText"
android:layout_marginLeft="@dimen/MarginMedium"
android:layout_marginTop="@dimen/MarginSmall"
android:hint="@string/MyAccount_Address"
android:imeOptions="actionNext"
android:inputType="text"
local:MvxBind="Text Address1" />
</LinearLayout>
不幸的是,textViewAddress1返回null。
// MyAccountFragment
View view = this.BindingInflate(this.layoutId, container, false);
var frameControl = view.FindViewById<MvxFrameControl>(Resource.Id.EditAddressView);
var textViewAddress1 = frameControl.FindViewById<EditText>(Resource.Id.Address1);
// textViewAddress1 == null
如何从MyAccountFragment检索此视图?
编辑1:
看到MvxControl的源代码,很明显MvxFrameControl在这个阶段没有膨胀:
public MvxFrameControl(int templateId, Context context, IAttributeSet attrs)
: base(context, attrs)
{
_templateId = templateId;
if (!(context is IMvxLayoutInflater))
{
throw Mvx.Exception("The owning Context for a MvxFrameControl must implement LayoutInflater");
}
_bindingContext = new MvxAndroidBindingContext(context, (IMvxLayoutInflater)context);
this.DelayBind(() =>
{
if (Content == null && _templateId != 0)
{
Mvx.Trace("DataContext is {0}", DataContext == null ? "Null" : DataContext.ToString());
Content = _bindingContext.BindingInflate(_templateId, this);
}
});
}
将通货膨胀置于仅在设置了DataContext时才执行的操作(如果我正确理解的话)。
所以我的问题很简单,在MvxFrameControl上的MvxFragment的哪一步设置数据上下文?
最佳答案
我找到了另一个解决方案。
使视图膨胀后,添加以下代码以强制delaybind发生:
BindingContext.DataContext = BindingContext.DataContext;
确保
BindingContext.DataContext
不为null :)