我正在使用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 :)

07-27 23:31