2017-06-12 9 views
0

次のような状況があります。MvxSpinnerリストが変更されたときにMvvmCrossがバインドされない

私はMvxSpinner

 <MvxSpinner 
      android:id="@+id/spinnerSubunit" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="5dp" 
      android:fontFamily="sans-serif" 
      android:textSize="16sp" 
      local:MvxBind="ItemsSource Subunits;SelectedItem SelectedSubunit;" /> 

を持って私のモデルは、この

private IList<SubunitModel> _subunits; 

    public IList<SubunitModel> Subunits 
    { 
     get { return _subunits; } 
     set 
     { 
      _subunits = value; 
      RaisePropertyChanged(() => Subunits); 
     } 
    } 

    private SubunitModel _selectedSubunit; 

    public SubunitModel SelectedSubunit 
    { 
     get { return _selectedSubunit; } 
     set 
     { 
      _selectedSubunit = value; 
      RaisePropertyChanged(() => SelectedSubunit); 

      OnSubunitSelected(); 
     } 
    } 

public class SubunitModel 
{ 
    public string Id { get; set; } 

    public string Name { get; set; } 

    public override bool Equals(object obj) 
    { 
     if (obj == null) 
     { 
      return false; 
     } 

     return Id == ((SubunitModel)obj).Id; 
    } 

    public override int GetHashCode() 
    { 
     return base.GetHashCode(); 
    } 

    public override string ToString() 
    { 
     return Name; 
    } 
} 

のように見えると私は特定のケースで奇妙な行動を発見しました。例えば

我々は第三の要素を選択する。ここ2つのリスト

enter image description here

を取ります。 (この要素のidが3であるとしましょう)

要素を選択すると、dbに保存されます。

リストを変更して要素が増えるので、最初のリストで選択された同じ要素がまだ含まれていることを確認します。 (写真2参照)。あなたが見ることができるように、同じ要素を持っていますが、位置は変更されています(これはもう3番目の要素ではありません)。

我々はDBからSelectedSubunitを取るメソッドを呼び出すリストを取得した後、選択したサブユニットは、現在のリストに存在し、それがない場合、それはSelectedSubunit

enter image description here

if (_subunits != null && _subunits.Any()) 
      { 
       var currentSubunit = await SettingsService.GetCurrentSubunitAsync(); 
       if (currentSubunit != null) 
       { 
        SelectedSubunit = currentSubunit; 
       } 
} 
としてそれをマークしている場合、チェックを

enter image description here

enter image description here

そして最後の問題:

画像3と4から分かります。新しいリスト(大きいもの)では、ビューに表示されている選択された要素が3番目です(DBに保存されているものではありません)。

何らかの理由で、バインディングがどこかで失われています。私はデバッガでチェックします。 SelectedSubunitの値は3、 "Sediu Central"ですが、選択したアイテムはX、Arcade(Real)です。

複数のリストを試しましたが、同じ結果です。 SelectedItemがいずれかに見つかった場合、ビューはスピナーを更新しません。これは、3番目のアイテムが選択されたものであることを示します。

私は自分自身を明確にしたので、状況を説明するのは難しいです。

+0

ここでは試して物事のカップルです:1)変更SubunitModel.ToString() '$ {Name}({Id})"を返すようにしてください。そうすれば、あなたはIdが期待していることを確認できます。 2)MvxSpinnerは、MvxAdapterを使用してItemsSource内のSelectedItemを検索します。 'var pos = Subunits.IndexOf(new SubunitModel {Id =" 3 "、Name =" "});'のようなコードを記述し、posが正しいことを確認して、Equalsメソッドが動作していることを確認してください。 – Kiliman

+0

https://stackoverflow.com/questions/22918100/mvxspinner-selecteditem-not-updated-on-itemssource-changeこれは役に立つかもしれません –

+0

@キリマンvar pos = Subunits.IndexOf(新しいSubunitModel {Id = "3"、名前= ""});正しい位置を返しますが、依然としてスピナーは自分の位置を更新しません。 – CiucaS

答えて

0

MvxSpinnerにはSelectedItemのプロパティはありません。

HandleItemSelectedにバインドすると、ViewModelがスピナーアイテムにバインドされます。

だから、あなたがあなたのバインディングを変更する場合:

local:MvxBind="ItemsSource Subunits; HandleItemSelected SubunitSelectedCommand" 

そして、あなたのViewModelにコマンドを追加します。

private MvxCommand<SubunitModel> _subunitSelectedCommand; 
public ICommand SubunitSelected => 
    _subunitSelectedCommand = 
     (_subunitSelectedCommand ?? new MvxCommand<SubunitModel>(OnSubunitSelected)); 

private void OnSubunitSelected(SubunitModel model) 
{ 
    SelectedSubunit = model; 
} 
+0

MvxSpinnerにSelectedItemがあるため、動作しています。これは私の問題にはまだ答えません。それは論理的な問題ではない。 ViewModelのリストの値を使ってリスト(ビュー)自体をリフレッシュしないことです。 – CiucaS

+0

私はこれが誰かが提供できる最高の答えだと思っています。それをサポートしているコードや再現可能なステップが不足しているような問題の説明からです。 – Cheesebaron

+0

@Cheesebaron:私は問題があります。0番目のインデックスについては、それはonlick event degaultを取っていて、最初にonclickを取るようにスピナーを止めたいと思っています。 – GvSharma

関連する問題