2016-04-01 24 views
4

私はAndroidにMvvmCross MvxSpinnerバインディングを持っています。ユーザーが値を選択すると、それが私のプロパティーに反映されますMealTypeSelectedMvxSpinner初期値

<MvxSpinner 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    local:MvxBind="ItemsSource MealTypeList;SelectedItem MealTypeSelected, Mode=TwoWay" /> 

スピナーは、ユーザーが食事の種類(朝食、昼食、夕食など)を選択できるようにします。食事の種類は、MealTypeと呼ばれる列挙型で表されます。

public enum MealType {Unspecified, Breakfast, Lunch, Dinner, Snack};

私はViewModelが示されている時刻に基づいた値にスピナーを初期化することによって、ユーザーにそれを容易にします。だから、正午にページが読み込まれたら、選択は "ランチ"でなければならないと思います。コンストラクタ、Init、およびStart

問題は、私はライフサイクルの異なる場所でViewModelMealTypeSelectedプロパティを設定しようとしている、です。しかし、私が何をしているかにかかわらず、Viewがロードされると、選択肢のEnumのデフォルト値に変更されます。これは値 "Unspecified"です。

この現象が回避され、MvxSpinnerが特定の値に初期化されていますか?

+1

私が思い出したことから、スピナーはItemsSourceの初期値を自動的に選択します。 SpinnerのItemsSourceを初期化して、最初のインデックスを時刻の特定のMealTypeにすることができます。 – pnavk

+0

これでうまくいきましたが、ユーザーがクリックするとスピナーのリストが「ランチ、未指定、朝食、ランチ、ディナー、スナック」になりました。私は明確にするためにいくつかのカスタムレイアウトを行うことができると思うが、それは理想的ではない。 – thedigitalsean

答えて

0

スタックオーバーフローは、pnavkのコメントを回答として受け入れることはできませんが、私がやったことです。ユーザーが何かを選択するたびに、最初の項目を選択したものに変更します。醜い解決策が、それは働いた。それが他の人に受け入れられない場合は、カスタムバインディングを行う必要があるようです。

1

"Setup.cs"ファイルにこれを追加してください。私も同じ闘いをしていましたが、これは私のために働いていました。初めて私が解決策を見つけた場所を覚えておいてください。

protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry) 
    { 
     MvxAppCompatSetupHelper.FillTargetFactories(registry); 
     base.FillTargetFactories(registry); 
    } 
+0

私は過去にもその問題に取り組んできましたが、幸運にも私のSetup.csにそれがすでにありました。あなたがそれを持っていない限り、バインディングはまったく動作しません。私の場合、バインディングは機能していますが、リストの最初の値以外に初期選択を設定することはできません。 – thedigitalsean

+0

viewmodelのプロパティで質問を更新しようとしますか? – Stupidus

1

MvxSpinnerのSelectedItemをViewModelにバインドする際に同様の問題が発生しましたが、これもViewModelで設定します。

この問題を解決するためにバインドしていたタイプのEqualsをオーバーライドします。

public override bool Equals(object obj) 
{ 
    return this.Id == (obj as MyType)?.Id; 
} 

列挙型に直接バインドされているように見えるので、別のオブジェクトでラップしようとする必要があります。

+0

これは本当の答えです。リストの並べ替えは回避策です。 – Jerome2606