在Android项目中,我正在尝试使用MvvmCross的CrossLight部分添加数据绑定。 绑定到标准TextView / Buttons工作得很好。但最简单的标记是Mvx.Control:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
<Mvx.MvxListView />
</LinearLayout>
给出错误
"Binary XML file line #1: Error inflating class Mvx.MvxListView"
同样的事情是Mvx.Spinner
。
但是,从Activity.OnCreate
:
_bindingContext = new MvxAndroidBindingContext(this, new LayoutInflaterProvider(LayoutInflater), _viewModel);
var view = (LinearLayout)_bindingContext.BindingInflate(Resource.Layout.Main, null);
SetContentView(view);
var spinner = new MvxSpinner(this, null, new MvxAdapter(this, _bindingContext));
view.AddView(spinner);
一切都很好(包括绑定)。我究竟做错了什么?这种情况一般是否受支持?
或者我可以引用除nuget MvvmCross.HotTuna.CrossCore
之外的任何其他内容?
P.S。未在github上找到任何包含自定义控件和CrossLight的示例,也未找到N+1 videos
答案 0 :(得分:2)
如果要在非MvvmCross应用程序中使用命名空间缩写,则需要添加这些缩写。这可以使用自定义绑定构建器或使用“轻”设置步骤来完成,如:
var viewResolver = Mvx.Resolve<IMvxAxmlNameViewTypeResolver>();
viewResolver.ViewNamespaceAbbreviations["Mvx"] = "Cirrious.MvvmCross.Binding.Droid.Views";
viewResolver.ViewNamespaceAbbreviations["MyApp"] = "MyApp.Controls";
在完整的MvvmCross应用程序中执行此操作时,您可以覆盖Setup
属性ViewNamespaceAbbreviations
protected override IDictionary<string, string> ViewNamespaceAbbreviations
{
get
{
var toReturn = base.ViewNamespaceAbbreviations;
toReturn["MyApp"] = "MyApp.UI.Droid.Controls";
return toReturn;
}
}
答案 1 :(得分:1)
当标记更改为使用完整命名空间并添加了layout_width
和layout_height
属性时,它开始起作用了!
<Cirrious.MvvmCross.Binding.Droid.Views.MvxSpinner
android:id="@+id/MySpinner"
android:layout_width="fill_parent"
android:layout_height="20dp"
/>
当我切换到默认的Android inflater并且它抱怨在例外中丢失layout_width
时发现了。