0

在 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

PS 在githubN+1 个视频上都没有找到任何带有自定义控件和 CrossLight 的示例

4

2 回答 2

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;
        }
    }
于 2013-10-30T09:34:01.760 回答
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在 Exceptions 中丢失。

于 2013-10-30T07:50:49.457 回答