使用ElementName绑定不起作用

时间:2011-11-01 09:09:48

标签: wpf binding

这是XAML:

<DataGrid Grid.Column="0"  AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding Path=Columns}"
              x:Name="ColumnsGrid" RowHeaderWidth="0">
        <DataGrid.Columns>
            <DataGridTextColumn Width="*" Binding="{Binding Path=Header}" 
                                Header="{Binding ElementName=ColumnsGrid, Path=DataContext.Count, StringFormat=Columns ({0}), diag:PresentationTraceSources.TraceLevel=High}"/>
        </DataGrid.Columns>  
    </DataGrid>

绑定返回错误:System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。

我想念什么?

更新

以下是答案: http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

  

这里发生了什么? Columns集合只是一个属性   在Datagrid中;这个集合不符合逻辑(或视觉)   树,因此DataContext没有被继承,这导致了   没有什么可以约束的。

更新2: 关于DataGrid警告的好文章:http://blogs.msdn.com/b/vinsibal/archive/2009/04/07/5-random-gotchas-with-the-wpf-datagrid.aspx

2 个答案:

答案 0 :(得分:1)

DataGridColumnHeaderVisibility属性的绑定需要特殊处理......

看到这个......

Bind datagrid column visibility MVVM

答案 1 :(得分:0)

如果您对DataContext中引用的对象的Count属性感兴趣,请尝试使用常规数据绑定:

<DataGrid Grid.Column="0"  AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding Path=Columns}"
          x:Name="ColumnsGrid" RowHeaderWidth="0">
    <DataGrid.Columns>
        <DataGridTextColumn Width="*" Binding="{Binding Path=Header}" 
                            Header="{Binding Path=Count, StringFormat=Columns ({0}), diag:PresentationTraceSources.TraceLevel=High}"/>
    </DataGrid.Columns>  
</DataGrid>

修改

显然the columns of a datagrid are not part of the Visual Tree 因此使用ElementName和RelativeSource将无法正常工作。 也许您应该将属性添加到列绑定的对象。