我使用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" />
&#13;
当选择此列表的项目时,用户将被转到处理此项目的页面。完成后,用户点击确认&#39;并返回此列表。此时,所选项目将突出显示(我喜欢),但无法再次单击。也就是说,如果再次单击它,则不会打开该项目。我明白为什么。没有选定的项目更改。但是,我似乎无法取消选择viewmodel的所选项目SelectedProductSearchResult&#34;。我已经把它归结为“无效”。 on&#39; OnRestart&#39;来自观点的事件。但是,再次选择项目时,未达到所选项目的设定者。
我也直接在视图中使用了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);
这很有用,但我觉得这很愚蠢,因为这意味着我必须单独为每个对象做这个。
必须有更好的方法来做到这一点。
非常感谢任何反馈!
斯特凡
答案 0 :(得分:4)
您没有包含您的viewmodel代码,但我相信您在SelectedProductSearchResult
属性的setter中执行导航逻辑。
这不是标准方法,您应该使用命令。
首先在viewmodel中实现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"
现在,当用户点击列表项时,您的命令将被执行,相关项目将作为参数传递。