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
相关产品推荐
相关产品推荐

