【问题标题】:WPF DataGrid SelectedItems - keeping multiple selected while left clickingWPF DataGrid SelectedItems - 左键单击时保持多个选中状态
【发布时间】:2011-01-12 02:44:45
【问题描述】:

有没有一种方法可以模仿 ctrl+click 的行为,让之前选择的行保持选中状态并添加更多选中的项目?

默认情况下,当点击每一行时,所有之前选择的行都会被取消选择。

实现此目的的一种方法是覆盖 SelectionChanged 事件,并重新选择已删除的行。

void TestGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) {
    foreach (var i in e.RemovedItems)
        TestGrid.SelectedItems.Add(i);

}

但这并不理想,因为在某些情况下,我想取消选择行(例如单击其中一列中的切换按钮时)。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    这并不漂亮,但如果您可以通过拖动不工作来选择多行,它就可以工作。

    private void dataGrid_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        var dep = (DependencyObject)e.OriginalSource;
    
        // iteratively traverse the visual tree
        while ((dep != null) &&
            !(dep is DataGridRow))
        {
            dep = VisualTreeHelper.GetParent(dep);
        }
    
        if (dep == null)
            return;
    
        if (dep is DataGridRow)
        {
            var row = dep as DataGridRow;
            row.IsSelected = !row.IsSelected;
            e.Handled = true;
        }
    }
    

    【讨论】:

      【解决方案2】:

      SelectionMode 设置为DataGridSelectionMode.Extended

      【讨论】:

      • nope.. 试过了.. 只允许在按住 ctrl 的同时进行多项选择
      • 我误解了你的问题。您希望它在点击不同的项目时继续选择项目但不让它们保持控制?
      • 是的,我想模仿按住 ctrl 的行为,而不必按住 ctrl。
      • 除了您建议的方法之外,我没有看到一种简单的方法可以让您做到这一点,并且为切换按钮添加逻辑,这看起来很混乱。问题是 DataGrid 有一个方法 ShouldMinimallyModifySelection 来检查是否按下了 Ctrl 键,这就是它如何与选择模式一起做出决定。我唯一的另一个想法是让它认为在进行新选择时按下了 Ctrl。
      【解决方案3】:

      这是一个对我有用的解决方案。

      我删除了所有设置细节可见性的属性(以保持一切默认)

      比添加了以下样式

      <Style x:Key="VisibilityStyle" TargetType="{x:Type DataGridRow}">
          <Style.Triggers>
              <DataTrigger Binding="{Binding Path=Visible}" Value="False">
                  <Setter Property="DetailsVisibility" Value="Collapsed" />
              </DataTrigger>
              <DataTrigger Binding="{Binding Path=Visible}" Value="True">
                  <Setter Property="DetailsVisibility" Value="Visible" />
              </DataTrigger>
          </Style.Triggers>
      </Style>
      

      将此资源分配给 RowStyle

      在我的底层数据对象中,我添加了 Visible 属性,并实现了 INotifyPropertyChanged 接口。

      现在,每当我想显示/隐藏详细信息时,我只需操作底层对象的 Visible 属性即可。这可能发生在列按钮处理程序中,也可能发生在我的代码中的其他任何地方。效果很好

      【讨论】:

        猜你喜欢
        • 2017-07-04
        • 1970-01-01
        • 1970-01-01
        • 2013-01-27
        • 2010-12-07
        • 1970-01-01
        • 1970-01-01
        • 2017-03-16
        • 2011-09-17
        相关资源
        最近更新 更多