3

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

When an item of this list is selected, the user is fowarded to a page where this item is handled. 完成后,用户单击“确认”并返回此列表。此时,选中的项目高亮显示(我喜欢),但无法再次点击。也就是说,如果您再次单击该项目,则不会打开它。我明白为什么。没有选定的项目更改。但是,我似乎无法取消选择视图模型的选定项目 SelectedProductSearchResult”。我已在来自视图的“OnRestart”事件中将其设置为“null”。但是再次选择项目时未达到选定项目的设置器.

我还直接在视图上使用了 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);

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

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

非常感谢任何反馈!

斯特凡

4

1 回答 1

4

您没有包含视图模型的代码,但我相信您在SelectedProductSearchResult属性的设置器中执行导航逻辑。这不是标准方法,您应该使用Command

首先在您的视图模型中实现 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"

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

于 2015-05-02T21:36:25.393 回答