2011-01-15 11 views
2

DataGridのヘッダー行をオーバーライドする方法はありますか?あるいは少なくともその行動は?私はテーブルのOutlookのようなグループ化を実装しようとしている。これは、ユーザーがテーブルから列ヘッダーを専用領域にドラッグしてその列で並べ替えることを可能にします(たとえば、XamDataGridはその機能を持っています)。hereの動作を確認できます。DataGridの拡張/ DataGridヘッダーの変更

商用ソリューションは使用できません。

私は、経験、アイデア、コード、ノート、またはチュートリアルに感謝します。

編集:見つけることができたいくつかの投稿によると、私はDataGridDataGridColumnsHeaderPresenterを私が望むことをできるように置き換える必要があります。私はそのようなことは一度もしていない、どこから始めたらいいのか分からない。 OK DataGridColumnsHeaderPresenterはオリジナルのDataGridColumnsHeaderPresenterと他のいくつかのコンポーネントで構成されます。 DataGridにデフォルト012の代わりにDataGridColumnsHeaderPresenterを使用するにはどうすればよいですか?可能であれば、コードを提供してください。

+1

http://www.pochet.net/blog/2010/08/25/drag-and-drop-grouping-in- DataGrid/ このリンクをクリックすると、silverlightとfoのリンクが表示されますあなたはまだあなたを助けるかもしれません:) – Wegged

+0

それは非常に有用です!ありがとうございました! – drasto

答えて

1

見つけるyaが

行くあなたのリソースにこれを入れ

に太字の部分を変更

<Style x:Key="DataGridStyle1" TargetType="{x:Type DataGrid}"> 
     <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
     <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
     <Setter Property="BorderBrush" Value="#FF688CAF"/> 
     <Setter Property="BorderThickness" Value="1"/> 
     <Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected"/> 
     <Setter Property="ScrollViewer.CanContentScroll" Value="true"/> 
     <Setter Property="ScrollViewer.PanningMode" Value="Both"/> 
     <Setter Property="Stylus.IsFlicksEnabled" Value="False"/> 
     <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> 
             <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}}}"/> 
             <Grid Grid.Column="1"> 
              <Grid.RowDefinitions> 
               <RowDefinition Height="Auto" /> 
               <RowDefinition Height="Auto" /> 
              </Grid.RowDefinitions> 
             **<DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter" 
              Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, 
              Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>** 
             <StackPanel Orientation="Horizontal" Grid.Row = "1" Grid.Column="1" ><Button Height="100">test</Button> 

              <Button Height="100">test</Button> 
              <Button Height="100">test</Button> 
              <Button Height="100">test</Button> 

             </StackPanel>         

             </Grid><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.Triggers> 
      <Trigger Property="IsGrouping" Value="true"> 
       <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

この

<DataGrid Margin="30,30,36,23" Grid.Row="1" Style="{DynamicResource DataGridStyle1}"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="fiorst"/> 
       <DataGridTextColumn Header="semd"/> 
      </DataGrid.Columns> 
     </DataGrid> 
のようにXAMLであなたのグリッドを宣言する

スタックパネルには、そこに必要なものを置くことができるボタンがあります。

希望あなたは、私はこのようにそれを行うだろうDataGridColumnsHeaderPresenterを変更したい場合は、これは

に役立ちます。

[TemplatePart(Name = "PART_ItemsHolder", Type = typeof(Panel))] 
public class MyDataGridColumnsHeaderPresenter:DataGridColumnsHeaderPresenter 
{ 
    private Panel _itemsHolder = null; 

    public override void OnApplyTemplate() 
     { 
      base.OnApplyTemplate(); 
      _itemsHolder = GetTemplateChild("PART_ItemsHolder") as Panel; 
     } 

    //for whatever other functionality you need for the sorting you can use the _itemsHolder variable 
} 

これは私がこのような何かにそれを変更しますプレゼンター

<ControlTemplate TargetType="{x:Type DataGridColumnHeadersPresenter}"> 
    <Grid> 
     <DataGridColumnHeader IsHitTestVisible="False"   
      Name="PART_FillerColumnHeader"/> 
     <ItemsPresenter /> 
    </Grid> 
</ControlTemplate> 

のデフォルトのテンプレートです。ここで

<ControlTemplate TargetType="{x:Type MyDataGridColumnHeadersPresenter}"> 
    <Grid> 
     <Grid.RowDefinitions> 
     <RowDefinition Height = "Auto" /> 
    <RowDefinition Height = "Auto" /> 
     </Grid.RowDefinitions> 
     <DataGridColumnHeader IsHitTestVisible="False"   
      Name="PART_FillerColumnHeader"/> 
     <ItemsPresenter Grid.Row="0" /> 
     <StackPanel Grid.Row="1" x:Name="PART_ItemsHolder /> 
    </Grid> 
</ControlTemplate> 

は、デフォルトのDataGrid

01のスタイルです 試験

          <Button Height="100">test</Button> 
              <Button Height="100">test</Button> 
              <Button Height="100">test</Button> 

             </StackPanel>         

             </Grid><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.Triggers> 
      <Trigger Property="IsGrouping" Value="true"> 
       <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
+0

これは視覚的なレイアウトを変更しますが、機能を追加しません。おそらく、新しい関数を追加するカスタム 'DataGridColumnsHeaderPresenter'を使う必要があります。元のものをどのように置き換えるのですか? – drasto

+1

DataGridColumnsHeaderPresenterを変更する必要があるとは思えません。列ヘッダーを生成するitemscontrolから継承しています。このパネルを追加する論理的な場所であるかどうかはわかりません。私はそれから継承する新しいクラスを作成し、パネルのテンプレート部分を追加するが、あなたはそのルートに行きたい場合。病気は私の答えにこれのためのいくつかのコードを追加します。より良い考え方は、実際にDataGridコントロール自体を拡張することです。 – Wegged

+0

@Wegged +1を編集します。実際には 'DataGrid'を拡張しますが、' DataGridColumnsHeaderPresenter'を置き換える必要があります。これは、 'DataGridColumnsHeaderPresenter'のデフォルトのドラッグアンドドロップ機能をオーバーライドして、ユーザーが上の領域に列ヘッダーをドラッグできるようにするためですその列でグループ化することができます。 – drasto

0

はい、コントロールテンプレートをやり直すことができます。 Hereは、Datagridのビジュアルレイアウトの投稿です。ポストは少し古いですが、私はそれが便利(私は私の机の上の壁に掲示コピーを持っている)

ここ
+0

さて、投稿は良いですが、それは私に例のコードを与えるものではなく、どこから始めたらいいのか分かりません。私が今までテンプレート化してきた最も複雑なコントロールはButtonです...サンプルコードを提供できますか? 'DataGrid'の列ヘッダーと行の間に' Hello world'というラベルを付けたいとしましょう。事前にありがとう:) – drasto

関連する問題