如何禁用DataGrid的 "全选 "按钮?

问题描述 投票:15回答:6

是否可以禁用WPF DataGrid左上角的 "全选 "按钮?

c# wpf xaml datagrid user-controls
6个回答
6
投票

在使用 史努比 为了分析我的一个测试应用程序的视觉树,我想出了这个解决方案,使用DataGrid_Loaded事件)。)

private void TheGrid_Loaded(object sender, RoutedEventArgs e) {
    var dataGrid = (DataGrid)sender;
    var border = (Border)VisualTreeHelper.GetChild(dataGrid, 0);
    var scrollViewer = (ScrollViewer)VisualTreeHelper.GetChild(border, 0);
    var grid = (Grid)VisualTreeHelper.GetChild(scrollViewer, 0);
    var button = (Button)VisualTreeHelper.GetChild(grid, 0);
    button.IsEnabled = false;
}

可能还有更优雅的XAML解决方案,但这是我首先想到的,而且看起来效果不错(显然我也没有做任何Exception处理)。

注意:我还没有玩过禁用再启用DataGrid来确保选择所有按钮的功能。逗留 禁用。如果它没有被禁用,那么你可能还想挂入DataGrid_IsEnabledChanged事件。

希望这能帮到你!


31
投票

有一个属性 HeadersVisibilityDataGrid. 它有四种价值: All, Column, Row, None.

随着 HeadersVisibility = All您将得到SelectAll按钮。

有了 HeadersVisibility = Column你将只得到列,而不是选择全部按钮或行标题来选择完整的行。而不是用SelectAll按钮或行头来选择一个完整的行。

使用 HeadersVisibility = Row你将只得到行头来选择整行。而不是选择全部按钮或列。

使用 HeadersVisibility = None你将一无所获。所有的标题都会被隐藏。

我希望这能帮助你。


3
投票

在SelectAll命令中添加一个命令绑定,并在CanExecute中返回false来禁用selectall按钮。

请看 事件为SelectAll。WPF数据网格


0
投票

我会改变 Control Templat需要在模板中禁用这个按钮,这是DataGrid的e.需要在模板中禁用这个按钮。DataGrid ControlTemplate:

  <ControlTemplate TargetType="{x:Type DataGrid}">
                    <Border BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            Background="{TemplateBinding Background}"
                            Padding="{TemplateBinding Padding}"
                            SnapsToDevicePixels="True">
                        <ScrollViewer x:Name="DG_ScrollViewer"
                                      Focusable="false">
                            <ScrollViewer.Template>
                                <ControlTemplate TargetType="{x:Type ScrollViewer}">
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="Auto" />
                                            <ColumnDefinition Width="*" />
                                            <ColumnDefinition Width="Auto" />
                                        </Grid.ColumnDefinitions>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto" />
                                            <RowDefinition Height="*" />
                                            <RowDefinition Height="Auto" />
                                        </Grid.RowDefinitions>
                                        <Button Command="{x:Static DataGrid.SelectAllCommand}"
                                                Focusable="false"
                                                Style="{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}}"
                                                Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.All}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                                Width="{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
                                        <DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter"
                                                                        Grid.Column="1"
                                                                        Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
                                        <ScrollContentPresenter x:Name="PART_ScrollContentPresenter"
                                                                CanContentScroll="{TemplateBinding CanContentScroll}"
                                                                Grid.ColumnSpan="2"
                                                                Grid.Row="1" />
                                        <ScrollBar x:Name="PART_VerticalScrollBar"
                                                   Grid.Column="2"
                                                   Maximum="{TemplateBinding ScrollableHeight}"
                                                   Orientation="Vertical"
                                                   Grid.Row="1"
                                                   Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
                                                   Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
                                                   ViewportSize="{TemplateBinding ViewportHeight}" />
                                        <Grid Grid.Column="1"
                                              Grid.Row="2">
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
                                                <ColumnDefinition Width="*" />
                                            </Grid.ColumnDefinitions>
                                            <ScrollBar x:Name="PART_HorizontalScrollBar"
                                                       Grid.Column="1"
                                                       Maximum="{TemplateBinding ScrollableWidth}"
                                                       Orientation="Horizontal"
                                                       Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
                                                       Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
                                                       ViewportSize="{TemplateBinding ViewportWidth}" />
                                        </Grid>
                                    </Grid>
                                </ControlTemplate>
                            </ScrollViewer.Template>
                            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                        </ScrollViewer>
                    </Border>
                </ControlTemplate>

手动禁用按钮,并将此按钮分配给用户。ControlTemplate 对你的 DataGrid.


0
投票

如果你不需要在你的DataGrid中进行扩展选择(例如,切换到单单元格选择),你可以设置。

 <DataGrid SelectionMode="Single">

它也会禁用左上角的SelectAll按钮。


0
投票

基于 本回答你可以保留你的标题和选择模式。

在你的用户控件的资源里面放上 。

<Style x:Key="{ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}"
       TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <!-- an empty ControlTemplate is fine -->
            <ControlTemplate TargetType="{x:Type Button}" />
        </Setter.Value>
    </Setter>
</Style>

Result

只要再多做一点工作,你就可以添加一个ToolTip来帮助用户发现。Ctrl换挡.

<Style x:Key="{ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}"
       TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <!-- an empty ControlTemplate is fine -->
            <ControlTemplate TargetType="{x:Type Button}">
                <DockPanel HorizontalAlignment="Center"
                           IsHitTestVisible="False"
                           VerticalAlignment="Center">
                    <TextBlock FontSize="18"
                               FontWeight="ExtraBlack"
                               Text="ⓘ"
                               TextAlignment="Center"
                               ToolTip="{StaticResource DataGridHowTo}" />
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Result 2

关于行头的复选框,请参见 此职位.

© www.soinside.com 2019 - 2024. All rights reserved.