【问题标题】:How to set the DataContext on a DataGrid Column Header如何在 DataGrid 列标题上设置 DataContext
【发布时间】:2010-12-19 16:42:30
【问题描述】:

在我的 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 中引用的“名称”和“数据”属性)。不幸的是,我不能按照elsewhere 的建议使用 StackPanel_Loaded 事件,因为当用户启动列拖放操作时也会调用事件处理程序。

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

【问题讨论】:

    标签: silverlight datagrid columnheader


    【解决方案1】:

    原来可以使用Header属性(Object类型)作为DataTemplate的DataContext(如上所示设置):

    Style headerStyle = (Style)Resources["ColumnHeaderStyle"];
    DataGridTextColumn col = new DataGridTextColumn();
    col.HeaderStyle = headerStyle;
    col.Header = myHeaderDataContext; // DataContext for ColumnHeaderStyle
    dataGrid.Columns.Add(col);
    

    【讨论】:

    • 不是我确定的方法,而是 +1 用于解释 Header 属性是 DataContext。
    【解决方案2】:

    以下是您在 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>
    

    【讨论】:

    • 我已经尝试过这种方法,它几乎可以工作。当我对 two 列标题名称进行数据绑定时,每一列都会获得第一列的名称。我已经两次和三次检查了我的数据绑定属性,据我所知,没有任何愚蠢的错误。有什么想法可能导致这种情况吗?
    • 你是一个救生员。非常感谢,这在 .Net 4.5 wpf 应用程序上运行良好。
    【解决方案3】:

    根据马特的回答,我想出了在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 并引用最近的祖先持有正确的数据上下文,而不是尝试访问像 UserControl 这样的顶级层次结构元素的数据上下文。

    【讨论】:

    • 感谢您的出色解决方案!我把它作为我的solution 的基础,所有版权都遵守了:)。
    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    相关资源
    最近更新 更多