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 githubでもN+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_widthlayout_height属性が追加されると、機能し始めました!

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

デフォルトの Android インフレータに切り替えたときに発見され、Exceptions にないことについて不平を言っていlayout_widthました。

于 2013-10-30T07:50:49.457 に答える