我正在使用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" />
当选择该列表中的某个项目时,用户将被引导到处理该项目的页面。完成此操作后,用户单击"确认"并返回到此列表。此时,所选项目会高亮显示(我喜欢),但无法再次单击。也就是说,如果您再次单击该项目,则不会打开该项目。我确实理解为什么。没有选定的项目更改。但是,我似乎无法取消选择视图模型的所选项目SelectedProductSearchResult"。我已在视图中的"OnRestart"事件中将其设置为"null"。但是,再次选择项目时未达到所选项目的setter。
我也直接在视图上玩过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);
这是有效的,但我认为这是非常愚蠢的,因为这意味着我必须分别为每个对象做这件事。
必须有更好的方法来做到这一点。
非常感谢您的反馈!
Stefaan
您没有包含视图模型的代码,但我相信您在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"
现在,当用户单击列表项时,将执行命令,并将相关项作为参数传递。