我有一个自定义视图(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" />
现在,在代码中,我想使用
MvxSpinner
的IAttributesof
添加一个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)