WPF Datagrid“全选”按钮 - “全部取消选择”?

时间:2009-09-29 16:03:02

标签: c# .net wpf datagrid wpfdatagrid

我想知道是否可以在数据网格左上角的“全选”按钮中添加功能,以便它也可以取消选择所有行?我有一个方法附加到一个按钮来执行此操作,但如果我可以从全选按钮触发此方法,以保持功能在视图的相同部分,这将是很好的。这个“全选”按钮是否可以添加代码,如果是,那么如何进入按钮?我找不到任何例子或建议。

2 个答案:

答案 0 :(得分:12)

好好经过大量搜索后我发现了怎么做到了Colin Eberhardt的按钮,在这里:

Styling hard-to-reach elements in control templates with attached behaviours

然后我在他的类中扩展了“Grid_Loaded”方法,为按钮添加了一个事件处理程序,但是请记住首先删除默认的“Select All”命令(否则,在运行我们添加的事件处理程序之后,命令获取跑)。

/// <summary>
/// Handles the DataGrid's Loaded event.
/// </summary>
/// <param name="sender">Sender object.</param>
/// <param name="e">Event args.</param>
private static void Grid_Loaded(object sender, RoutedEventArgs e)
{
    DataGrid grid = sender as DataGrid;
    DependencyObject dep = grid;

    // Navigate down the visual tree to the button
    while (!(dep is Button))
    {
        dep = VisualTreeHelper.GetChild(dep, 0);
    }

    Button button = dep as Button;

    // apply our new template
    ControlTemplate template = GetSelectAllButtonTemplate(grid);
    button.Template = template;
    button.Command = null;
    button.Click += new RoutedEventHandler(SelectAllClicked);
}

/// <summary>
/// Handles the DataGrid's select all button's click event.
/// </summary>
/// <param name="sender">Sender object.</param>
/// <param name="e">Event args.</param>
private static void SelectAllClicked(object sender, RoutedEventArgs e)
{
    Button button = sender as Button;
    DependencyObject dep = button;

    // Navigate up the visual tree to the grid
    while (!(dep is DataGrid))
    {
        dep = VisualTreeHelper.GetParent(dep);
    }

    DataGrid grid = dep as DataGrid;

    if (grid.SelectedItems.Count < grid.Items.Count)
    {
        grid.SelectAll();
    }
    else
    {
        grid.UnselectAll();
    }

    e.Handled = true;
}

基本上,如果没有选择任何行,它会“选择全部”,如果没有,则“取消选择全部”。它的工作方式非常像你期望选择/取消选择所有工作,我不敢相信他们没有让命令默认这样做,说实话,也许在下一个版本中。

希望这对任何人都有帮助, 干杯, 将

答案 1 :(得分:2)

我们可以添加一个命令绑定来处理selectall事件。

请参阅:Event for Select All: WPF Datagrid