【问题标题】:Mvvmcross ListView SelectedItem setter not reached未达到 Mvvmcross ListView SelectedItem 设置器
【发布时间】:2015-07-11 10:21:28
【问题描述】:

我正在使用 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 的选定项目,因此对我没有帮助。

最后,我发现所选项目没有改变(相同的对象),因此没有到达 setter。我现在在视图模型的 OnRestart 方法中包含以下部分,它更新列表,因为所有项目都是新对象:

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

ProductSearchResultLst = new ObservableCollection<WHM_PRODUCT> (productLst);

这行得通,但我认为这很愚蠢,因为这意味着我必须为每个对象单独执行此操作。

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

非常感谢任何反馈!

史蒂芬

【问题讨论】:

    标签: listview xamarin mvvmcross selecteditem unselect


    【解决方案1】:

    您没有包含视图模型的代码,但我相信您在 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"
    

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

    【讨论】:

    • Endrus,非常感谢。尽管我被使用 setter 进行导航的优雅所吸引(您对我的实现的假设是正确的),但您的解决方案更有意义。我已经实现了它并且效果很好。我仍然对为什么 setter 不起作用(即第二次)感到有些困惑,但这更像是一个理论问题而不是实际问题。如果有人知道答案,我很感兴趣。再次感谢!
    • 不客气! :) 关于您的解决方案 - 我认为只需将 SelectedProductSearchResult 设置为 null 应该取消选择列表视图项。您确定在将 SelectedProductSearchResult 的值设置为 null 后调用了 RaisePropertyChanged 吗?
    • 是的,调用了 RaisePropertyChanged,因为这是设置器逻辑的一部分。
    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 2014-11-11
    • 2023-03-09
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    相关资源
    最近更新 更多