2010-12-21 57 views

回答

2

有趣的是,DataGrid的這一部分是沒有人的土地 - 它甚至沒有正式的名稱,更不用說行爲或模板。爲了處理與此區域有關的事件,請參閱herehere

0

在我發現的至少一個示例中,單擊拐角處的灰色三角形將導致選擇所有行。

但據我所知,這不是該控件的內置功能。它是自定義模板的一部分。如果你下載的樣本 http://www.dotnetspark.com/kb/2941-styling-wpf-datagrid.aspx

,以及搜索資源/ DataGridCustomization.xaml文件「全選」,你會發現,包含此功能的模板的一部分:

看到這個例子。

1

我稱之爲'全選'按鈕。但是,它沒有正式名稱。它也沒有任何暴露的樣式屬性。對於一個簡單的方法,通過附加的屬性設置樣式,請參閱以下內容:

http://www.scottlogic.co.uk/blog/colin/2009/02/styling-hard-to-reach-elements-in-control-templates-with-attached-behaviours/

科林·E.

+0

+1鏈接,非常有幫助。我做了幾乎完全一樣的事情,在這篇文章中提出的風格這個該死的按鈕,因爲我當時沒有發現任何有用的東西。這真的很煩人,MS沒有打擾它的命名...... – David 2010-12-21 10:49:11

1

正如其他人所指出的,它的「全選」按鈕。如果SelectionMode設置爲Extended,單擊它將選擇DataGrid中的所有內容。

「全選」按鈕是DataGrid模板的一部分。或者實際上,它是ScrollViewer模板的一部分,它是DataGrid模板的一部分,所以它嵌套得非常深。 ControlTemplate看起來像這樣。從這裏你可以做你想做與全選按鈕什麼,禁用它,更改背景等

<Style TargetType="{x:Type DataGrid}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <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> 

            <!-- Here it is --> 
            <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> 
     </Setter.Value> 
    </Setter> 
</Style> 
1

如果要禁用全選按鈕,你也可以這樣做:

//Disable select all button 
    datagrid.CommandBindings.Add(new CommandBinding(DataGrid.SelectAllCommand, delegate { }, (s, a) => { if (a.OriginalSource is Button) ((Button)a.OriginalSource).IsEnabled = false; })); 

作爲解決方法。 這也可以用來連接其他的東西。

「問題」與重新模板是,你必須把所有的主題進去......繁瑣的:)

+0

+1!這是一個非常酷的'技巧'!會記得那一個 – 2010-12-21 16:06:44