找不到MvxListItemView构造函数

时间:2017-04-21 11:10:10

标签: android xamarin mvvmcross

我是Xamarin的新手,但需要创建一个Android应用,所以现在是时候学习了。

我听说MvvmCross,并认为这将是一个很好的补充,因为它似乎简化了一些事情。

我创建了一个基本的应用程序,有一个文本框来显示,那种事情。

然后我尝试使用Dilbert示例添加列表视图。

当我尝试使用MvxListItemView

运行视图时
protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    SetContentView(Resource.Layout.ProcessFormView);
}

我收到此错误。

  

System.NotSupportedException:无法找到构造函数   签名(Android.Content.Context,Android.Util.IAttributeSet)上   键入MvvmCross.Binding.Droid.Views.MvxListItemView。请提供   缺少的构造函数。

从我所看到的构造函数是

public MvxListItemView(Context context, IMvxLayoutInflaterHolder layoutInflaterHolder, object dataContext, int templateId);

我在我和演示中找不到任何明显的差异。

是否有我遗漏或可能被忽视的事情?

ProcessFormView.axml:

<?xml version="1.0" encoding="utf-8"?>
<Mvx.MvxListView xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:local="http://schemas.android.com/apk/res-auto"
             android:orientation="vertical"
             android:layout_width="fill_parent"
             android:layout_height="fill_parent"
             local:MvxBind="ItemsSource Form"
             local:MvxItemTemplate="@layout/FormItem" />

FormItem.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="40dp"
        android:text="Form Item" />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="40dp"
        local:MvxBind="Text Field" />
</LinearLayout>

1 个答案:

答案 0 :(得分:2)

在我看来,好像Android无法找到它正在寻找的MvxListItemView构造函数,因为它正在搜索错误的程序集。您在布局中使用Mvx.MvxListView,但这是一个快捷方式,需要您在Setup类中注册命名空间缩写。有三种方法可以解决问题:

选项1:AndroidViewAssemblies

将布局中的Mvx.MvxListView更改为MvxListView。然后,您需要向Android提供用于查找MvxListView的程序集,这可以通过AndroidViewAssemblies中的Setup覆盖来完成:

protected override IEnumerable<Assembly> AndroidViewAssemblies 
    => new List<Assembly>(base.AndroidViewAssemblies)
{
    typeof(MvvmCross.Binding.Droid.Views.MvxListView).Assembly,
    typeof(MvvmCross.Binding.Droid.Views.MvxListItemView).Assembly
};

这是一个更干净的选择,也是我亲自参与的选择。请注意,您需要对应用程序中的每个Mvx控件执行相同的两个步骤:从布局中删除命名空间,并注册它的程序集。

选项2:ViewNamespaceAbbreviations

此选项告诉Android Mvx.MvxListView实际上意味着MvvmCross.Binding.Droid.Views.MvxListItemView,并且还通过Setup中的覆盖来实现:

protected override IDictionary<string, string> ViewNamespaceAbbreviations
    => new Dictionary<string, string>
{
    {
        "Mvx", "MvvmCross.Binding.Droid.Views"
    }
};

如果您决定选项2,请务必保持布局不变(即仍然使用Mvx.MvxListView)。

选项3:懒惰

解决此问题的最简单方法是通过将Mvx.MvxListView更改为MvvmCross.Binding.Droid.Views.MvxListView来完全限定布局中的命名空间。这里的缺点是你需要完全限定你使用的每个MvvmCross控件,这是尴尬和混乱。