列表更改时,MvxSpinner MvvmCross无法绑定

时间:2017-06-12 15:27:11

标签: android mvvmcross mvxbind

所以我有以下情况。

我有一个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

这里我们选择第3个元素。 (让我们说这个元素的id是3)

选择元素后,它将保存在db中。

现在,如果我们更改列表,因此它有更多元素,我们确保它仍包含在第一个列表中选择的相同元素。 (见图2)。正如你所看到它具有相同的元素,但它的位置已经改变(它不再是第三个元素)。

在我们得到列表之后,我们调用一个方法,该方法从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,&#34; Sediu Central&#34;,但在微调器上显示为选中的项目是X,Arcade(Real)。

我尝试了多个列表,结果相同。如果在其中任何一个中找到SelectedItem,则视图不会更新微调器,它显示为第三个项目是所选的一个。

希望我说清楚,很难解释这种情况。

1 个答案:

答案 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;
}