[英]Silverlight DataGrid Header Binding
我正在使用HeaderStyle属性来自定义Silverlight DataGrid列标题。 有没有一种方法可以将ControlTemplate内的控件绑定到基于列索引的集合中的对象? 类似于以下内容?
<Style x:Key="GradeDefinitionHeaderStyle" TargetType="dataprimitives:DataGridColumnHeader">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<TextBlock Text="{Binding MyCollection[i]}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
在标题控件模板中:
<Grid>
<Grid.Resources>
<local:DataGridColumnBindingHelper x:Key="DataGridColumnBindingHelper"
ElementInColumn="{Binding ., RelativeSource={RelativeSource TemplatedParent}"
Items={Binding MyCollection} />
</Grid.Resources>
<TextBlock Text="{Binding CurrentItem, Source={StaticResource DataGridColumnBindingHelper}}"/>
</Grid>
在DataGridColumnBindingHelper类内部:
private static void OnElementInColumnPropertyChanged(DataGridColumnBindingHelper self, FrameworkElement oldValue, FrameworkElement newValue)
{
var column = DataGridColumn.GetColumnContainingElement(newValue);
var dataGrid = newValue.GetVisualAncestors().OfType<DataGrid>().FirstOrDefault();
if (dataGrid != null)
{
var columnIndex = dataGrid.Columns.IndexOf(column);
self.CurrentItem = self.Items[columnIndex];
}
}
请注意,绑定到MyCollection可能无法正常工作。 您可以使用自定义附加属性将所需的集合附加到XAML中定义的列,然后按以下方式在此处读取它(在DataGridColumnBindingHelper中):
private static void OnElementInColumnPropertyChanged(DataGridColumnBindingHelper self, FrameworkElement oldValue, FrameworkElement newValue)
{
var column = DataGridColumn.GetColumnContainingElement(newValue);
var dataGrid = newValue.GetVisualAncestors().OfType<DataGrid>().FirstOrDefault();
if (dataGrid != null)
{
var columnIndex = dataGrid.Columns.IndexOf(column);
var items = DataGridColProperties.GetItems(column); // read attached property
self.CurrentItem = items[columnIndex]; // you do not need the Items property in this case
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.