将DataGridColumns标头绑定到窗口的DataContext

本文关键字:窗口 DataContext 绑定 DataGridColumns | 更新日期: 2023-09-27 18:25:26

我有一个DataGrid,想将Header-属性绑定到我的窗口DataContext的属性,但我没有让它工作。

绑定可能是一种痛苦,因为(对我来说)当简单地使用Binding时,永远不清楚this具有哪个上下文。我知道Binding={}中的"上下文"是DataGridItemsSource的单个元素。但是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和没有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(不确定这是否有什么要说的)。

将DataGridColumns标头绑定到窗口的DataContext

由于DataGridTextColumn或任何其他支持的数据网格列不是datagrid的可视化树的一部分,因此它们不会继承datagridDataContext。因为,它们不在视觉树中,所以任何使用RelativeSource获取DataContext的尝试都不起作用。

解决方案-您可以创建一个代理元素来绑定window/control的数据上下文;使用该代理元素来绑定CCD_ 19的Header。

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