Как установить DataContext в заголовке столбца DataGrid
в своем Silverlight 3 user control я показываю базовый 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" (со свойствами" Name "и" Data", на которые ссылается DataTemplate). К сожалению, я не могу использовать событие StackPanel_Loaded как предложил везде, потому что обработчик событий также вызывается, когда пользователь начинает операцию перетаскивания столбца.
каков правильный способ установки DataContext заголовка столбца DataGrid?
3 ответов
оказывается, что можно использовать заголовок собственность (который имеет тип Object) как DataContext для DataTemplate (указанные выше):
Style headerStyle = (Style)Resources["ColumnHeaderStyle"];
DataGridTextColumn col = new DataGridTextColumn();
col.HeaderStyle = headerStyle;
col.Header = myHeaderDataContext; // DataContext for ColumnHeaderStyle
dataGrid.Columns.Add(col);
вот как вы это сделаете в 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>
основываясь на ответе Мэтта, я придумал решение привязки заголовка к 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>
и это не является навязчивым способом, которым вы все еще можете наследовать от пользовательских заголовков в стиле (см. exemple выше) или event стиль заголовка базового столбца:
<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 вместо того, чтобы пытаться достичь datacontext верхних элементов иерархии, таких как UserControl.