Tôi đã tự hỏi nếu có vô hiệu hóa việc chọn tất cả các tùy chọn ở góc trên cùng của DataFrid WPF .... điều này dường như chỉ xảy ra khi tôi thêm UserControl vào một tài liệu cố định trong WPF.Chọn tất cả các nút WPF DataGrid
Cảm ơn trước,
U.
Tôi đã tự hỏi nếu có vô hiệu hóa việc chọn tất cả các tùy chọn ở góc trên cùng của DataFrid WPF .... điều này dường như chỉ xảy ra khi tôi thêm UserControl vào một tài liệu cố định trong WPF.Chọn tất cả các nút WPF DataGrid
Cảm ơn trước,
U.
Sau khi sử dụng Snoop để phân tích các cây trực quan của một ứng dụng thử nghiệm tôi đặt lại với nhau, tôi đã đưa ra với giải pháp này sử dụng các sự kiện 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;
}
Có thể có một giải pháp XAML thanh lịch hơn chỉ có ở đó, nhưng đây là những gì đến đầu tiên, và nó có vẻ hoạt động tốt (tôi rõ ràng là không thực hiện bất kỳ xử lý ngoại lệ nào).
Lưu ý: Tôi chưa chơi với vô hiệu hóa/kích hoạt lại DataGrid để đảm bảo rằng nút chọn tất cả vẫn bị vô hiệu hóa. Nếu nó không bị vô hiệu hóa, sau đó bạn có thể cũng muốn móc vào sự kiện DataGrid_IsEnabledChanged.
Hy vọng điều này sẽ giúp ích !!
Đây là một giải pháp tồi và rất dễ bị tổn thương khi sửa đổi trong cấu trúc xaml. Sử dụng liên kết với lệnh như được gợi ý bởi Eben nếu bạn chỉ muốn vô hiệu hóa nút, hoặc tắt hiển thị như được gợi ý bởi Varun nếu bạn muốn ẩn nút. – TheRoadrunner
Có một bất động sản HeadersVisibility
trong DataGrid
. Nó có bốn giá trị - All
, Column
, , None
.
Với HeadersVisibility = All
, bạn sẽ nhận được nút SelectAll.
Với HeadersVisibility = Column
, bạn sẽ chỉ nhận được Cột. Không phải là SelectAll Button hoặc Row Headers để chọn một hàng hoàn chỉnh.
Với HeadersVisibility = Row
, bạn sẽ chỉ nhận tiêu đề Hàng để chọn toàn bộ hàng. Không phải là nút SelectAll hoặc cột.
Với HeadersVisibility = None
, bạn sẽ không nhận được gì. Tất cả tiêu đề sẽ bị ẩn.
Tôi hy vọng điều này sẽ giúp bạn.
Thêm lệnh vào lệnh SelectAll và trả về false trong CanExecute để vô hiệu hóa nút selectall.
tôi sẽ thay đổi Control Templat
e của DataGrid. Cần phải tắt nút này bên trong mẫu. Đây là 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>
Vô hiệu hóa nút nó bằng tay và gán này ControlTemplate
-DataGrid
của bạn.
Tôi không chắc chắn về việc vô hiệu hóa nó, nhưng tôi đã phát hiện việc ẩn các RowHeaders của bạn sẽ ẩn nó. (gây ra vấn đề cho tôi vì tôi muốn ẩn RowHeaders nhưng hiển thị nút SelectAll) – Rachel