C# 将DataGridColumns标头绑定到窗口的DataContext

C# 将DataGridColumns标头绑定到窗口的DataContext,c#,wpf,xaml,binding,datagrid,C#,Wpf,Xaml,Binding,Datagrid,我有一个数据网格,想将标题-属性绑定到我的windows数据上下文的属性,但我没有让它工作 绑定可能是一种痛苦,因为(对我来说)当简单地使用Binding时,永远不清楚这个有什么上下文。 我知道Binding={}中的“Context”是DataGridsitemsource的单个元素。但是头={Binding???}的“上下文”是什么 我已经试过了: Header="{Binding Path=DataContext.MyProperty, RelativeSource={RelativeSo

我有一个
数据网格
,想将
标题
-属性绑定到我的windows
数据上下文
的属性,但我没有让它工作

绑定可能是一种痛苦,因为(对我来说)当简单地使用
Binding
时,永远不清楚这个
有什么上下文。
我知道
Binding={}
中的“Context”是
DataGrid
s
itemsource
的单个元素。但是
头={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}
我试过使用和不使用路径,但都不起作用

例如,将最后一个与
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.flout中(不确定这是否有什么要说的)。因为
DataGridTextColumn
或任何其他受支持的数据网格列不属于
DataGrid
的可视树,所以它们不会继承
DataGrid
DataContext
。因为,它们不在可视化树中,所以任何使用
相对资源
获取
数据上下文的尝试都不会起作用

解决方案-您可以创建一个代理元素来绑定
窗口/控件的数据上下文
;使用该代理元素绑定
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>


我通常在运行时查看我的DataContext和绑定错误谢谢。这就是我永远不会喜欢
绑定的原因之一。另一方面,为什么工作?ProxyElement是一个FrameworkElement,它从主视图窃取DataContext并将其提供给逻辑子级,如DataGridTextColumn。为此,它必须作为内容托管到同一视图下的不可见ContentControl中。不确定中提到的答案是否有效。确实有效,而且(对我来说)比使用代理更简单(可读性更好)。但这只是我的意见。