Xamarin Forms中CollectionView无法二次选中项及重置后命令触发两次问题
CollectionView选中同一项两次触发Command的解决方案
问题根因
SelectionChanged事件及绑定的SelectionChangedCommand只要选中项发生变更就会触发:
- 第一次触发:选中列表项,选中项从
null变为对应公司对象 - 第二次触发:手动将
SelectedItem设为null,选中项从公司对象变回null
你原本的SelectedCompanysetter过滤了null赋值,所以第二次触发Command时SelectedCompany仍保留上一次选中的值,导致日志打印和页面跳转逻辑执行两次。
可选解决方案
方案1:Command逻辑加判空(改动最小)
直接在CompanySelected方法开头新增选中项非空判断,跳过选中项为空的触发场景即可,原有其他代码不需要调整:
void CompanySelected(SelectionChangedEventArgs args) { // 选中项为空时直接跳过执行 if (args.CurrentSelection == null || args.CurrentSelection.Count == 0) return; Debug.WriteLine("Company Selected Name = " + SelectedCompany.Name); Navigation.PushAsync(new CompanyDetailPage(SelectedCompany)); }
方案2:纯MVVM实现(无后台代码,更规范)
完全删掉页面后台的SelectionChanged事件注册和逻辑代码,直接在ViewModel中处理选中重置,更符合MVVM模式:
- 首先修改XAML代码,删除
SelectionChanged事件绑定,补充SelectedItem双向绑定声明:
<CollectionView ItemsSource="{Binding CompanyListItems}" SelectedItem="{Binding SelectedCompany, Mode=TwoWay}" SelectionChangedCommand="{Binding CompanySelectedCommand}" SelectionMode="Single"> <CollectionView.ItemTemplate> <DataTemplate> <StackLayout> <Label Text="{Binding Name}" /> </StackLayout> </DataTemplate> </CollectionView>
- 调整ViewModel的
SelectedCompanysetter和逻辑,执行完选中操作后自动重置:
public CompanyListItem SelectedCompany { get { return selectedCompany; } set { selectedCompany = value; OnPropertyChanged(nameof(SelectedCompany)); // 仅当选中项非空时执行业务逻辑 if (value != null) { Debug.WriteLine("Company Selected Name = " + value.Name); Navigation.PushAsync(new CompanyDetailPage(value)); // 执行完直接重置选中项 SelectedCompany = null; } } }
这种方案可以完全避免页面后台代码,后续维护更方便。
内容的提问来源于stack exchange,提问作者Junaid Pathan
相关产品推荐
相关产品推荐

