1

在 Silverligh 4 中,列表绑定到 DataGrid:

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

绑定到 DataGridTemplateColumn 中的 TextBlock 的 IsDirty 属性是 DetailsCollection 的属性。DataGridTemplateColumn 中的 Binding 正在查看列表中特定项目的属性。我怎样才能改变这种行为以获取列表的属性?

4

1 回答 1

1

您不能“开箱即用”地做到这一点。原因是 DataGridCell 的 DataContext 设置为它所绑定的项。有几种不同的方法可以做到这一点。最简单的方法可能只是修改您的数据项以返回列表。如果您经常需要这样做,您可能需要编写一个工具来帮助您。

您可以创建一个名为 AncestorDataContext 之类的附加属性,该属性遍历显示树(请参阅 VisualTreeHelper)并按名称搜索目标元素。当它找到它时,它会将它的 FrameworkElement 的 DataContext 设置为找到的控件,即您的 DataGrid。我一直在使用这种方法来弥补 SL 中相对源 FindAncestor 的不足。

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

于 2011-02-11T18:19:23.710 回答