在我的 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的正确方法是什么?
答案 0 :(得分:6)
事实证明,可以使用 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 :(得分:5)
以下是如何在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>
答案 2 :(得分:2)
根据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。