You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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);
            }
        }
    }
}

原因分析

  1. 事件逻辑中每次从Preferences读取旧值追加,会导致多次触发事件时内容重复累积;
  2. dxColView.SelectedItems强转为List<DynamicReportsParameters>可能失败,导致mList为null,无法遍历完整列表;
  3. 若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规范:

  1. 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);
}
  1. XAML中移除事件绑定,保留SelectedItems绑定即可:
<dxcv:DXCollectionView ItemsSource="{Binding ReportsParameters}"
                       DisplayMember="VIEW_QUERY"
                       SelectionMode="Multiple"
                       SelectedItems="{Binding SelectedReportsParameters}"
                       DisplayFormat="Query: {0}">
</dxcv:DXCollectionView>

内容的提问来源于stack exchange,提问作者Mert Altiparmak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:00:01