2010-10-12 87 views
1

我正在使用HeaderStyle屬性來自定義Silverlight DataGrid列標題。有沒有辦法將ControlTemplate內部的控件綁定到基於列索引的集合中的對象?類似於以下內容的東西?Silverlight DataGrid頁眉綁定

<Style x:Key="GradeDefinitionHeaderStyle" TargetType="dataprimitives:DataGridColumnHeader"> 
<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate> 
      <TextBlock Text="{Binding MyCollection[i]}"/>       
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

回答

0

在你的頭控件模板:

<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 
    } 
}