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"
现在,当用户点击列表项时,您的命令将被执行,相关项将作为参数传递。
我正在使用 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"
现在,当用户点击列表项时,您的命令将被执行,相关项将作为参数传递。