所以我有以下情況。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)
當我選擇一個元素後,它被保存在數據庫中。
現在,如果我們改變列表,所以它有更多的元素,我們確保它仍然包含在第一個列表中選擇相同的元素。 (見圖2)。正如你可以看到它有相同的元素,但它的位置發生了變化(它不再是第三個元素)。
後,我們得到了我們調用一個方法列表,這需要從數據庫中SelectedSubunit,檢查是否在當前列表中存在的選出的子單元,如果它做它標記爲SelectedSubunit
if (_subunits != null && _subunits.Any())
{
var currentSubunit = await SettingsService.GetCurrentSubunitAsync();
if (currentSubunit != null)
{
SelectedSubunit = currentSubunit;
}
}
最後的問題:
從圖3和圖4可以看到。在新列表中(較大的),視圖中顯示的選定元素是第三個(不是保存在數據庫中的元素)。
由於某種原因,綁定在某處丟失。當我檢查調試器。 SelectedSubunit具有正確的值3,「Sediu Central」,但在微調器上顯示爲選中的項目是X,街機(真實)。
我已經嘗試了多個列表,結果相同。如果在其中任何一箇中都找到SelectedItem,則該視圖不更新微調器,它顯示爲第三個項目是所選項目。
希望我說清楚了,很難解釋這種情況。
這裏有幾件事情嘗試:1)更改SubunitModel.ToString()返回'$「{Name}({Id})」'這樣你就可以驗證Id是你期望的。 2)MvxSpinner使用MvxAdapter來查找ItemsSource中的SelectedItem。通過編寫像var var = Subunits.IndexOf(new SubunitModel {Id =「3」,Name =「」});'確保您的Equals方法正在工作,並確保pos是正確的。 – Kiliman
https://stackoverflow.com/questions/22918100/mvxspinner-selecteditem-not-updated-on-itemssource-change這可能有幫助 –
@Kiliman var pos = Subunits.IndexOf(new SubunitModel {Id =「3」,Name =「」});返回正確的位置,但仍然微調不更新他的位置。 – CiucaS