MvxSpinner / MvxListView不适用于axml的MvvmCross Light(Chimp)

时间:2013-10-30 07:21:15

标签: android xamarin.android mvvmcross

在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

2 个答案:

答案 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_widthlayout_height属性时,它开始起作用了!

  <Cirrious.MvvmCross.Binding.Droid.Views.MvxSpinner
    android:id="@+id/MySpinner"
    android:layout_width="fill_parent"
    android:layout_height="20dp"
    />

当我切换到默认的Android inflater并且它抱怨在例外中丢失layout_width时发现了。