未到达Mvvmcross ListView SelectedItem setter

时间:2015-05-01 15:01:02

标签: listview xamarin mvvmcross selecteditem unselect

我使用MvvmCross通过Xamarin在Android上构建应用。

我已经在这个问题上苦苦挣扎了一段时间,我找到了解决办法,但我很确定这不是正确的做法。

它涉及MvxListView中的选定项目:



<Mvx.MvxListView
  android:id="@+id/productSearchResultListView"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  local:MvxBind="ItemsSource ProductSearchResultLst; SelectedItem SelectedProductSearchResult"
  local:MvxItemTemplate="@layout/productsearchresult_row" />
&#13;
&#13;
&#13;

当选择此列表的项目时,用户将被转到处理此项目的页面。完成后,用户点击确认&#39;并返回此列表。此时,所选项目将突出显示(我喜欢),但无法再次单击。也就是说,如果再次单击它,则不会打开该项目。我明白为什么。没有选定的项目更改。但是,我似乎无法取消选择viewmodel的所选项目SelectedProductSearchResult&#34;。我已经把它归结为“无效”。 on&#39; OnRestart&#39;来自观点的事件。但是,再次选择项目时,未达到所选项目的设定者。

我也直接在视图中使用了ClearChoices和SetItemChecked,但这并没有取消选择我的VM的所选项目,因此对我没有帮助。

最后,我发现所选项目没有变化(同一个对象),因此未达到设定者。我现在在viewmodel的OnRestart方法中包含以下部分,它在这个意义上更新了列表,所有项都是新对象:

var productLst = new List<WHM_PRODUCT> ();
foreach (var item in ProductSearchResultLst)
     productLst.Add (item.Clone());

ProductSearchResultLst = new ObservableCollection<WHM_PRODUCT> (productLst);

这很有用,但我觉得这很愚蠢,因为这意味着我必须单独为每个对象做这个。

必须有更好的方法来做到这一点。

非常感谢任何反馈!

斯特凡

1 个答案:

答案 0 :(得分:4)

您没有包含您的viewmodel代码,但我相信您在SelectedProductSearchResult属性的setter中执行导航逻辑。 这不是标准方法,您应该使用命令

首先在viewmodel中实现Command属性:

public ICommand NavigateToDetailCommand
        {
            get
            {
                return new MvxCommand<WHM_PRODUCT>(item =>
                {
                    //Perform navigation logic here
                    ShowViewModel<DetailViewModel>(new { id = item.Id });
                });
            }
        }

然后将它绑定到MvxListView上的ItemClick:

local:MvxBind="ItemsSource ProductSearchResultLst; ItemClick NavigateToDetailCommand"

现在,当用户点击列表项时,您的命令将被执行,相关项目将作为参数传递。