所以我有以下情况。
我有一个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个列表
这里我们选择第3个元素。 (让我们说这个元素的id是3)
选择元素后,它将保存在db中。
现在,如果我们更改列表,因此它有更多元素,我们确保它仍包含在第一个列表中选择的相同元素。 (见图2)。正如你所看到它具有相同的元素,但它的位置已经改变(它不再是第三个元素)。
在我们得到列表之后,我们调用一个方法,该方法从DB中获取SelectedSubunit,检查当前列表中是否存在所选子单元,如果是,则将其标记为SelectedSubunit
if (_subunits != null && _subunits.Any())
{
var currentSubunit = await SettingsService.GetCurrentSubunitAsync();
if (currentSubunit != null)
{
SelectedSubunit = currentSubunit;
}
}
最后问题是:
从图3和图4中可以看到。在新列表(较大的列表)中,视图中显示的所选元素是第3个(不是DB中保存的元素)。
由于某种原因,绑定在某处丢失了。当我检查调试器。 SelectedSubunit具有正确的值3,&#34; Sediu Central&#34;,但在微调器上显示为选中的项目是X,Arcade(Real)。
我尝试了多个列表,结果相同。如果在其中任何一个中找到SelectedItem,则视图不会更新微调器,它显示为第三个项目是所选的一个。
希望我说清楚,很难解释这种情况。
答案 0 :(得分:0)
SelectedItem
上没有MvxSpinner
属性。
您可以绑定到HandleItemSelected
,它会为您提供绑定到Spinner项目的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;
}