次のような状況があります。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つのリスト
を取ります。 (この要素のidが3であるとしましょう)
要素を選択すると、dbに保存されます。
リストを変更して要素が増えるので、最初のリストで選択された同じ要素がまだ含まれていることを確認します。 (写真2参照)。あなたが見ることができるように、同じ要素を持っていますが、位置は変更されています(これはもう3番目の要素ではありません)。
我々はDBからSelectedSubunitを取るメソッドを呼び出すリストを取得した後、選択したサブユニットは、現在のリストに存在し、それがない場合、それはSelectedSubunit
if (_subunits != null && _subunits.Any())
{
var currentSubunit = await SettingsService.GetCurrentSubunitAsync();
if (currentSubunit != null)
{
SelectedSubunit = currentSubunit;
}
}
としてそれをマークしている場合、チェックを
そして最後の問題:
画像3と4から分かります。新しいリスト(大きいもの)では、ビューに表示されている選択された要素が3番目です(DBに保存されているものではありません)。
何らかの理由で、バインディングがどこかで失われています。私はデバッガでチェックします。 SelectedSubunitの値は3、 "Sediu Central"ですが、選択したアイテムはX、Arcade(Real)です。
複数のリストを試しましたが、同じ結果です。 SelectedItemがいずれかに見つかった場合、ビューはスピナーを更新しません。これは、3番目のアイテムが選択されたものであることを示します。
私は自分自身を明確にしたので、状況を説明するのは難しいです。
ここでは試して物事のカップルです:1)変更SubunitModel.ToString() '$ {Name}({Id})"を返すようにしてください。そうすれば、あなたはIdが期待していることを確認できます。 2)MvxSpinnerは、MvxAdapterを使用してItemsSource内のSelectedItemを検索します。 'var pos = Subunits.IndexOf(new SubunitModel {Id =" 3 "、Name =" "});'のようなコードを記述し、posが正しいことを確認して、Equalsメソッドが動作していることを確認してください。 – Kiliman
https://stackoverflow.com/questions/22918100/mvxspinner-selecteditem-not-updated-on-itemssource-changeこれは役に立つかもしれません –
@キリマンvar pos = Subunits.IndexOf(新しいSubunitModel {Id = "3"、名前= ""});正しい位置を返しますが、依然としてスピナーは自分の位置を更新しません。 – CiucaS