WPF DataGrid SelectedItems - 在左键单击时保持多个选定

时间:2010-06-01 21:33:48

标签: c# wpf

有没有办法模仿ctrl + click的行为,这会保留选定的先前选定的行,只添加更多选定的项目?

默认情况下,单击每一行时,所有先前选定的行都将被取消选中。

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

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

}

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

3 个答案:

答案 0 :(得分:2)

这不是很好,但如果你可以通过拖动不工作来选择多行,那么它就可以了。

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;
    }
}

答案 1 :(得分:0)

SelectionMode设置为DataGridSelectionMode.Extended

答案 2 :(得分:0)

这是一个适合我的解决方案。

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

而不是添加以下样式

<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属性,以及Implemented INotifyPropertyChanged接口。

现在每当我想显示/隐藏细节时,我只是操纵我的底层对象上的Visible属性。这可以从列按钮处理程序发生到我的代码中的任何其他位置。效果很好