DataGrid: привязка внутри DataGridTemplateColumn к свойству списка - PullRequest
1 голос
/ 11 февраля 2011

Список привязан к DataGrid в Silverligh 4:

<data:DataGrid
        x:Name="dataGrid"    
        ItemsSource="{Binding DetailsCollection}"
        IsReadOnly="True">
    <data:DataGrid.Columns>                    
        <data:DataGridTemplateColumn>
            <data:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding IsDirty, Converter={StaticResource IsDirtyConverter}}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                </DataTemplate>
            </data:DataGridTemplateColumn.CellTemplate>
        </data:DataGridTemplateColumn>
    </data:DataGrid.Columns>
</data:DataGrid>

Свойство IsDirty, привязанное к TextBlock в DataGridTemplateColumn, является свойством DetailsCollection. Привязка внутри DataGridTemplateColumn просматривает свойства определенного элемента в списке. Как я мог изменить это поведение, чтобы получить свойство списка?

1 Ответ

1 голос
/ 11 февраля 2011

Вы не можете сделать это "из коробки".Причина в том, что DataContext объекта DataGridCell установлен на элемент, с которым он связан.Есть несколько разных способов сделать это.Вероятно, самый простой способ - это просто изменить элемент данных, чтобы вернуться к списку.Если вам нужно сделать это много, вы, возможно, захотите написать инструмент, чтобы помочь вам.

Вы можете создать прикрепленное свойство, которое называется что-то вроде AncestorDataContext, которое обходит дерево отображения (см. VisualTreeHelper) и ищет цельэлемент по имени.Когда он находит его, он устанавливает DataContext своего FrameworkElement для найденного элемента управления, вашей DataGrid.Я много использовал этот подход, чтобы восполнить отсутствие RelativeSource FindAncestor в SL.

<DataTemplate><Border custom:AncestorDataContext="dataGrid">
  <TextBlock Text="{Binding ItemsSource.IsDirty, Converter={StaticResource IsDirtyConverter}}"  HorizontalAlignment="Center" VerticalAlignment="Center" />

...