7

私のSilverlight3ユーザーコントロールでは、基本的なDataGridコントロールを示しています。次のようにプログラムで列を生成する必要があります。

Style headerStyle = (Style)Resources["ColumnHeaderStyle"];
DataGridTextColumn col = new DataGridTextColumn();
col.HeaderStyle = headerStyle;
dataGrid.Columns.Add(col);

スタイルは次のように定義されます。

<Style x:Name="ColumnStyle" x:Key="ColumnHeaderStyle" 
       TargetType="prim:DataGridColumnHeader">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Loaded="StackPanel_Loaded">
                    <TextBlock Text="{Binding Name}" />
                    <TextBlock Text="{Binding Data}" />
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

ヘッダーのデータコンテキストを「header」オブジェクト(DataTemplateで参照される「Name」および「Data」プロパティを使用)に設定したいと思います。残念ながら、他の場所で提案されているようにStackPanel_Loadedイベントを使用することはできません。これは、ユーザーが列のドラッグアンドドロップ操作を開始したときにイベントハンドラーも呼び出されるためです。

DataGrid列ヘッダーのDataContextを設定する正しい方法は何ですか?

4

3 に答える 3

6

DataTemplate(上記のように設定)のDataContextとしてHeaderプロパティ(Object型)を使用できることがわかりました。

Style headerStyle = (Style)Resources["ColumnHeaderStyle"];
DataGridTextColumn col = new DataGridTextColumn();
col.HeaderStyle = headerStyle;
col.Header = myHeaderDataContext; // DataContext for ColumnHeaderStyle
dataGrid.Columns.Add(col);
于 2009-11-24T04:23:31.607 に答える
6

XAMLでこれを行う方法は次のとおりです(これはWPFで機能します。SLで機能するかどうかはわかりません)

<DataGridTextColumn Binding="{Binding Path=Discount}">
    <DataGridTextColumn.HeaderStyle>
        <Style TargetType="DataGridColumnHeader">
            <Setter Property="Content" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=DataContext.DiscountHeader}" />
        </Style>
    </DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
于 2011-01-04T21:38:26.683 に答える
3

DataGridCellsPanelMattの回答に基づいて、Snoopで正しいデータコンテキストを持っているように見えるヘッダーをバインドするソリューションを思いつきました。

  <DataGridTemplateColumn.HeaderStyle>
     <Style TargetType="{x:Type DataGridColumnHeader}" BasedOn="{StaticResource CenterAlignedColumnHeaderStyle}">
         <Setter Property="Content" Value="{Binding Path=DataContext.Location, RelativeSource={RelativeSource AncestorType={x:Type DataGridCellsPanel}}}" />
      </Style>
  </DataGridTemplateColumn.HeaderStyle>

また、これは、カスタムスタイルのヘッダー(上記の例を参照)から継承したり、ベース列ヘッダースタイルをイベント化したりできるという点で邪魔になりません。

 <DataGridTemplateColumn.HeaderStyle>
     <Style TargetType="{x:Type DataGridColumnHeader}" BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
     <Setter Property="Content" Value="{Binding Path=DataContext.Location, RelativeSource={RelativeSource AncestorType={x:Type DataGridCellsPanel}}}" />
     </Style>
 </DataGridTemplateColumn.HeaderStyle>

このソリューションには、純粋でクリーンなXAMLであり、UserControlなどの最上位階層要素のデータコンテキストに到達しようとするのではなく、正しいデータコンテキストを保持している最も近い祖先を参照するという利点があります。

于 2013-07-01T11:06:57.740 に答える