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

WinUI3中ListView多选时如何通过CommandParameter传递选中项至ViewModel

解决WinUI 3多选ListView选中项传递至ViewModel的问题

问题根源

你当前使用CommandParameter="{Binding}"时,SelectionChanged事件触发的上下文是整个ListView,而非选中项,且默认不会自动传递选中项集合,导致参数为null。

方案一:通过事件参数获取选中项

修改XAML中的InvokeCommandAction,开启传递事件参数,在ViewModel中接收事件参数来获取选中项:

修改后的MyPage.xaml

<ListView
    x:Name="ValidationFlagsListView"
    SelectionMode="Multiple"
    ItemsSource="{x:Bind ViewModel.ValidationFlagsList, Mode=OneTime}"
    SelectedValuePath="Key"
    DisplayMemberPath="Value">
    <interactivity:Interaction.Behaviors>
        <core:EventTriggerBehavior EventName="SelectionChanged">
            <core:InvokeCommandAction 
                Command="{x:Bind ViewModel.FlagCheckBoxChangedCommand}" 
                PassEventArgsToCommand="True" /> 
        </core:EventTriggerBehavior>
    </interactivity:Interaction.Behaviors>
</ListView>

修改后的MyViewModel.cs

public IEnumerable<KeyValuePair<string, string>> ValidationFlagsList => EnumExtensions.GetAllValuesAndDescriptions<ValidationFlag>();

public ICommand FlagCheckBoxChangedCommand { get; }

public MyViewModel() 
{
    FlagCheckBoxChangedCommand = new RelayCommand<SelectionChangedEventArgs>(FlagCheckBox_Changed);
}

private void FlagCheckBox_Changed(SelectionChangedEventArgs e)
{
    // 获取本次新增的选中项
    var addedFlags = e.AddedItems.Cast<KeyValuePair<string, string>>();
    // 获取本次取消选中的项
    var removedFlags = e.RemovedItems.Cast<KeyValuePair<string, string>>();
    
    // 若需要获取所有当前选中项,可通过ListView实例访问SelectedItems
    // 需在ViewModel中通过页面传递或其他方式获取ListView实例
}

方案二:绑定选中项集合到ViewModel(更符合MVVM)

直接将ListView的选中项集合绑定到ViewModel属性,无需依赖事件参数:

第一步:在ViewModel中添加选中项集合属性

private ObservableCollection<KeyValuePair<string, string>> _selectedValidationFlags = new();
public ObservableCollection<KeyValuePair<string, string>> SelectedValidationFlags
{
    get => _selectedValidationFlags;
    set => SetProperty(ref _selectedValidationFlags, value);
}

第二步:修改XAML绑定SelectedItems

<ListView
    SelectionMode="Multiple"
    ItemsSource="{x:Bind ViewModel.ValidationFlagsList, Mode=OneTime}"
    SelectedValuePath="Key"
    DisplayMemberPath="Value"
    SelectedItems="{x:Bind ViewModel.SelectedValidationFlags, Mode=TwoWay}">
</ListView>

第三步:监听选中项变化(可选)

若需要在选中项变更时执行逻辑,可监听集合变化事件:

public MyViewModel()
{
    SelectedValidationFlags.CollectionChanged += SelectedValidationFlags_CollectionChanged;
}

private void SelectedValidationFlags_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    // 处理选中项变更逻辑
    var addedFlags = e?.NewItems?.Cast<KeyValuePair<string, string>>();
    var removedFlags = e?.OldItems?.Cast<KeyValuePair<string, string>>();
}

注意事项

  • 方案一中,WinUI 3的ListView.SelectedItems并非可绑定集合,若要在ViewModel中获取全量选中项,需通过页面传递ListView实例,或优先选择方案二的绑定方式。
  • 确保使用的RelayCommand支持泛型参数(Template Studio生成的RelayCommand默认支持)。

内容的提问来源于stack exchange,提问作者Mihai Socaciu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:22:57