Привязка заголовка Silverlight DataGrid - PullRequest
1 голос
/ 12 октября 2010

Я использую свойство 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>

1 Ответ

0 голосов
/ 11 декабря 2012

В вашем шаблоне управления заголовком:

<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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...