如何在Xamarin Forms中正确获取DevExpress CollectionView的选中行?
问题:Xamarin.Forms中DevExpress DXCollectionView多选时无法获取完整选中项列表
在Xamarin.Forms中使用DevExpress的DXCollectionView展示数据,XAML代码如下:
<dxcv:DXCollectionView ItemsSource="{Binding ReportsParameters}" DisplayMember="VIEW_QUERY" SelectionMode="Multiple" SelectionChanged="DXCollectionView_SelectionChanged" SelectedItems="{Binding SelectedReportsParameters}" DisplayFormat="Query: {0}"> </dxcv:DXCollectionView>
绑定了SelectedItems到ViewModel的SelectedReportsParameters,但SelectionChanged事件处理方法每次只能获取到最后一项,无法拿到完整的选中项列表,事件代码如下:
private void DXCollectionView_SelectionChanged(object sender, DevExpress.XamarinForms.CollectionView.CollectionViewSelectionChangedEventArgs e) { if (sender != null) { var dxColView = (DevExpress.XamarinForms.CollectionView.DXCollectionView)sender; if (dxColView != null) { foreach (DynamicReportsParameters item in dxColView.SelectedItems) { string query = Preferences.Get("query", ""); query += item.VIEW_QUERY + ';'; Preferences.Set("query", query); Console.WriteLine(query); } var mList = dxColView.SelectedItems as List<DynamicReportsParameters>; foreach (var item in mList) { Console.WriteLine(item.VIEW_QUERY); } } } }
原因分析
- 事件逻辑中每次从Preferences读取旧值追加,会导致多次触发事件时内容重复累积;
dxColView.SelectedItems强转为List<DynamicReportsParameters>可能失败,导致mList为null,无法遍历完整列表;- 若ViewModel中的
SelectedReportsParameters未使用可观察集合,绑定无法同步完整选中项。
解决方法
方法1:修正SelectionChanged事件处理逻辑
直接遍历SelectedItems集合,同时避免重复追加缓存内容:
private void DXCollectionView_SelectionChanged(object sender, DevExpress.XamarinForms.CollectionView.CollectionViewSelectionChangedEventArgs e) { var dxColView = sender as DevExpress.XamarinForms.CollectionView.DXCollectionView; if (dxColView == null) return; // 清空旧缓存,避免重复追加 Preferences.Set("query", ""); string query = string.Empty; // 遍历完整选中项集合 foreach (DynamicReportsParameters item in dxColView.SelectedItems) { query += item.VIEW_QUERY + ';'; Console.WriteLine(item.VIEW_QUERY); } Preferences.Set("query", query); Console.WriteLine("最终拼接的query:" + query); }
注意:SelectedItems本身是IEnumerable类型,无需强转为List,强转失败会引发空引用异常。
方法2:利用ViewModel绑定(推荐MVVM模式)
通过ViewModel的可观察集合同步选中项,更符合MVVM规范:
- ViewModel中定义可观察集合并监听变化:
public ObservableCollection<DynamicReportsParameters> SelectedReportsParameters { get; set; } public YourViewModel() { SelectedReportsParameters = new ObservableCollection<DynamicReportsParameters>(); SelectedReportsParameters.CollectionChanged += SelectedReportsParameters_CollectionChanged; } private void SelectedReportsParameters_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { string query = string.Empty; foreach (var item in SelectedReportsParameters) { query += item.VIEW_QUERY + ';'; } Preferences.Set("query", query); Console.WriteLine("拼接的query:" + query); }
- XAML中移除事件绑定,保留
SelectedItems绑定即可:
<dxcv:DXCollectionView ItemsSource="{Binding ReportsParameters}" DisplayMember="VIEW_QUERY" SelectionMode="Multiple" SelectedItems="{Binding SelectedReportsParameters}" DisplayFormat="Query: {0}"> </dxcv:DXCollectionView>
内容的提问来源于stack exchange,提问作者Mert Altiparmak
相关产品推荐
相关产品推荐

