Mvvmcross ListView SelectedItem setter 未达到

Mvvmcross ListView SelectedItem setter not reached

我正在使用 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" />

选择此列表中的项目后,用户将转到处理此项目的页面。完成后,用户单击 'confirm' 和 returns 到此列表。此时选中的item高亮显示(我喜欢),但是不能再次点击。也就是说,如果您再次单击该项目,则不会将其打开。我明白为什么。没有选定的项目更改。但是,我似乎无法取消选择视图模型的选定项目 SelectedProductSearchResult”。我已经将它放在来自视图的 'OnRestart' 事件的 'null' 中。但是选定项目的 setter再次选择项目时未达到

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

最后,我发现所选项目未更改(同一对象),因此未达到 setter。我现在在 viewmodel 的 OnRestart 方法中加入了以下内容,它更新了列表,因为所有项目都是新对象:

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

ProductSearchResultLst = new ObservableCollection<WHM_PRODUCT> (productLst);

这可行,但我认为这非常愚蠢,因为这意味着我必须分别为每个对象执行此操作。

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

非常感谢任何反馈!

史蒂芬

您没有包含视图模型的代码,但我相信您在 SelectedProductSearchResult 属性 的 setter 中执行了导航逻辑。 这不是标准方法,您应该使用 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"

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