我有DataGrid
并希望将Header
- 属性绑定到我的窗口DataContext
的属性,但我没有让它工作。
绑定可能是一种痛苦,因为(对我来说)在使用this
时,永远不清楚哪个上下文Binding
有。
我知道Binding={}
中的“上下文”是DataGrid
s ItemsSource
的单个元素。但Header={Binding ???}
的“背景”是什么?
我已经尝试过了:
Header="{Binding Path=DataContext.MyProperty, RelativeSource={RelativeSource Self}}
Header="{Binding Path=DataContext.MyProperty, RelativeSource={RelativeSource TemplatedParent}}
Header="{Binding Path=DataContext.MyProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyWindow}}}
Header="{Binding Path=DataContext.MyProperty, ElementName=MyWindowName}
我尝试使用和不使用Path但没有任何工作。
例如,使用ElementName
的最后一个,我得到以下绑定异常:
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=DataContext.MyProperty; DataItem=null; target element is 'DataGridTextColumn' (HashCode=51072575); target property is 'Header' (type 'Object')
是否有任何工具可以在运行时检查/更改绑定?或者甚至知道当前的“背景”是什么?
注意:DataGrid
位于Mahapps.Flyout内(不确定是否有话要说)。
答案 0 :(得分:2)
由于DataGridTextColumn
或任何其他受支持的数据网格列不属于datagrid
的可视树,因此他们不会继承DataContext
的{{1}}。因为,他们不会躺在视觉树中,所以任何试图datagrid
DataContext
使用RelativeSource
都无法工作。
解决方案 - 您可以创建一个代理元素来绑定window/control
的数据上下文;使用该代理元素绑定DataGridTextColumn
的标头。
<Grid>
<Grid.Resources>
<FrameworkElement x:Key="ProxyElement" DataContext="{Binding}"/>
</Grid.Resources>
<ContentControl Visibility="Collapsed" Content="{StaticResource ProxyElement}"></ContentControl>
<DataGrid
ItemsSource="{Binding Collection}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="{Binding DataContext.MyProperty, Source={StaticResource ProxyElement}}" Binding="{Binding PropertyName}" />
</DataGrid.Columns>
</DataGrid>
</Grid>