7

在我的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>

我想将标头的数据上下文设置为“标头”对象(具有在 DataTemplate 中引用的“名称”和“数据”属性)。不幸的是,我不能使用其他地方建议的 StackPanel_Loaded 事件,因为当用户启动列拖放操作时也会调用事件处理程序。

设置 DataGrid 列标题的 DataContext 的正确方法是什么?

4

3 回答 3

6

事实证明,可以使用Header 属性(对象类型)作为DataTemplate 的 DataContext(如上所示设置):

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

根据马特的回答,我想出了将标头绑定到DataGridCellsPanelSnoop 中似乎具有正确数据上下文的解决方案:

  <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 回答