【问题标题】:How to get mulitple SelectedItems (rows) on WPF DataGrid [duplicate]如何在 WPF DataGrid 中获取多个选定项(行)[重复]
【发布时间】:2020-02-20 14:55:44
【问题描述】:

如何在 WPF DataGrid 上获取多个 Selected Items(行)?

我只能使用 SelectedItem 属性获取一个选定的项目。

XAML:

<Window x:Class="WpfDataGridTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <DataGrid ItemsSource="{Binding Items}"
                  SelectedItem="{Binding SelectedItem}">
        </DataGrid>
    </Grid>
</Window>

视图模型:

  public class MainViewModel
  {
    public MainViewModel(IEnumerable<Customer> customers)
    {
      Items = new ObservableCollection<Customer>(customers);
    }

    public ObservableCollection<Customer> Items { get; }

    public Customer SelectedItem { get; set; }
  }


如果我选择多行,则 SelectedItem 保持不变。 如何获取多个选中项?

【问题讨论】:

  • 您可以使用 SelectionChanged 事件处理程序,并将 SelectedItems 发送到 VM。

标签: c# wpf mvvm


【解决方案1】:
  1. 使用 nuget 依赖 MvvmLight
  2. 使用 SelectionChanged 事件处理程序,并将 SelectedItems 发送到 VM(感谢 https://stackoverflow.com/users/2289942/nawed-nabi-zada

见下面的代码

XAML:

<Window x:Class="WpfDataGridTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">
    <Grid>
        <DataGrid ItemsSource="{Binding Items}"
                  SelectedItem="{Binding SelectedItem}"
                  Name="grid">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectionChanged">
                    <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}" 
                                           CommandParameter="{Binding SelectedItems, ElementName=grid}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </DataGrid>
    </Grid>
</Window>

视图模型:

  public class MainViewModel
  {
    public MainViewModel(IEnumerable<Customer> customers)
    {
      Items = new ObservableCollection<Customer>(customers);
    }

    public ObservableCollection<Customer> Items { get; }

    public Customer SelectedItem { get; set; }

    public ICommand SelectionChangedCommand => _selectionChangedCommand ?? (_selectionChangedCommand = new RelayCommand<IList>(OnChanged));

    private void OnChanged(IList dataset)
    {
      var selectedItems = dataset.OfType<Customer>();
    }

    private ICommand _selectionChangedCommand;
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-24
    • 2016-08-11
    • 1970-01-01
    • 2017-08-18
    • 2014-12-04
    • 1970-01-01
    • 2016-10-13
    相关资源
    最近更新 更多