我有一个自定义视图(MyCustomView),我想在其中添加MvxSpinner和一些TextView。我想将所有绑定放在自定义视图上,然后将它们传递给MvxSpinner,因此我可以使用下面的示例将这个新组件集成到我的应用程序中,每次使用不同的绑定。

例如。

在xml中

<MyCustomView
    android:width="match_parent"
    android:height="match_parent"
    local:MvxItemTemplate="@layout/item_spinner_dark"
    local:MvxBind="ItemsSource StampTypes"
    local:MvxDropDownItemTemplate="@layout/spinner_dropdown_item" />


现在,在代码中,我想使用MvxSpinnerIAttributesof添加一个MyCustomView

public class MyCustomView : MvxRelativeLayout
{

    private MvxSpinner _spinner;
    private TextView _errorTxt;

    // A bunch of constructors

    public MyCustomView (Context context, IAttributeSet attrs, IMvxAdapterWithChangedEvent adapter)
      : base(context, attrs, adapter)
    {
        // Create an MvxSpinner with the attributes
        // IMvxAdapterWithChangedEvent is always null
        if(adapter == null){
            _spinner = new MvxSpinner(context, attrs);
        } else {
            _spinner = new MvxSpinner(context, attrs, adapter);
        }

        // Add View to the Layout
        AddView(_spinner);

        // Add a TextView
        _errorTxt = new TextView(context);
        _errorTxt.SetPadding(8, 8, 8, 8);
        _errorTxt.SetTextAppearance(context, Android.Resource.Attribute.TextAppearanceLarge);
        _errorTxt.SetTextColor(Android.Graphics.Color.Red);
        AddView(_errorTxt);
    }
}


上面的代码可以编译并运行,但是根据local:MvxBind="ItemsSource StampTypes"并未填充MvxSpinner。当我删除MyCustomView并直接使用MvxSpinner时,所有操作均按预期进行。以下是普通MvxSpinner(其工作原理类似于超级按钮)和MyCustomView结果的屏幕截图,其中MvxSpinner未显示任何项目。



最初,我认为使用IAttributes创建MvxSpinner可以解决问题。但是,IMvxAdapterWithChangedEvent参数为null,所以我跑去尝试自己创建适配器。我想念什么?

题:
那么,如何使用这些MvxSpinner以编程方式创建IAttributes

注意:我从RelativeLayout扩展,因为当我从MvxSpinner扩展时,无法将TextView添加到视图中。

最佳答案

我认为您无法使用MvxRelativeLayout做您想做的事情。

提供MvxRelativeLayout是为了允许您在相对布局内绑定项目集合-并非设计用于手动插入项目。

您可能可以通过以下方式实现与您的“可重用控制”要求匹配的功能:


使用https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Binding.Droid/Views/MvxFrameControl.cs-或通过创建类似于该控件的类(而是基于RelativeLayout)-有关此内容(http://mvvmcross.blogspot.co.uk/),请参见N = 26的结尾
使用Android <include>块。
使用C#属性创建一个自定义Android控件,并将其转发到包含的控件(自定义控件的介绍请参见N = 18)

07-24 09:27