2017-06-12 45 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)

當我選擇一個元素後,它被保存在數據庫中。

現在,如果我們改變列表,所以它有更多的元素,我們確保它仍然包含在第一個列表中選擇相同的元素。 (見圖2)。正如你可以看到它有相同的元素,但它的位置發生了變化(它不再是第三個元素)。

後,我們得到了我們調用一個方法列表,這需要從數據庫中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可以看到。在新列表中(較大的),視圖中顯示的選定元素是第三個(不是保存在數據庫中的元素)。

由於某種原因,綁定在某處丟失。當我檢查調試器。 SelectedSubunit具有正確的值3,「Sediu Central」,但在微調器上顯示爲選中的項目是X,街機(真實)。

我已經嘗試了多個列表,結果相同。如果在其中任何一箇中都找到SelectedItem,則該視圖不更新微調器,它顯示爲第三個項目是所選項目。

希望我說清楚了,很難解釋這種情況。

+0

這裏有幾件事情嘗試:1)更改SubunitModel.ToString()返回'$「{Name}({Id})」'這樣你就可以驗證Id是你期望的。 2)MvxSpinner使用MvxAdapter來查找ItemsSource中的SelectedItem。通過編寫像var var = Subunits.IndexOf(new SubunitModel {Id =「3」,Name =「」});'確保您的Equals方法正在工作,並確保pos是正確的。 – Kiliman

+0

https://stackoverflow.com/questions/22918100/mvxspinner-selecteditem-not-updated-on-itemssource-change這可能有幫助 –

+0

@Kiliman var pos = Subunits.IndexOf(new SubunitModel {Id =「3」,Name =「」});返回正確的位置,但仍然微調不更新他的位置。 – CiucaS

回答

0

MvxSpinner上沒有SelectedItem財產。

你可以綁定到HandleItemSelected,它給你綁定到微調項目的ViewModel

所以,如果你改變你的綁定:

local:MvxBind="ItemsSource Subunits; HandleItemSelected SubunitSelectedCommand" 

,然後添加命令到您的視圖模型:

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事件degault,並且想要第一次停止spinner進行onclick。 – GvSharma