Silverlight 如何在DataGrid列标题上设置DataContext

Silverlight 如何在DataGrid列标题上设置DataContext,silverlight,datagrid,columnheader,Silverlight,Datagrid,Columnheader,在我的Silverlight 3用户控件中,我显示了一个基本的DataGrid控件。我需要以编程方式生成列,如下所示: Style headerStyle = (Style)Resources["ColumnHeaderStyle"]; DataGridTextColumn col = new DataGridTextColumn(); col.HeaderStyle = headerStyle; dataGrid.Columns.Add(col); <Style x:Name="Col

在我的Silverlight 3用户控件中,我显示了一个基本的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>
样式定义如下:

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的正确方法是什么?

结果表明,可以使用标题属性(类型为Object)作为DataTemplate的DataContext(如上所示设置):


下面是如何在XAML中实现它(这在WPF中有效;不确定是否在SL中有效)


根据Matt的回答,我提出了在
DataGridCellsPanel
上绑定标题的解决方案,在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,并引用拥有正确datacontext的最近祖先,而不是试图访问顶级层次结构元素(如UserControl)的datacontext。

不完全是我确定的方法,而是+1来解释Header属性是datacontext。我已经尝试过这个方法方法,它几乎可以工作。当我对两个列标题名进行数据绑定时,每一列都会得到第一列的名称。我已经仔细检查了我的数据绑定属性,据我所知,没有任何愚蠢的错误。你知道这是什么原因吗?你是个救生员。非常感谢,这在.NET4.5WPF应用程序上非常有效。感谢您提供了很好的解决方案!我把它作为我的工作的基础,所有的版权都遵守:)。