К сожалению, любой DataGridColumn
, размещенный в DataGrid.Columns
, не является частью дерева Visual
и поэтому не связан с контекстом данных сетки данных. Таким образом, привязки не работают со своими свойствами, такими как Visibility
или Header
и т. Д. (Хотя эти свойства являются допустимыми свойствами зависимости!).
Теперь вы можете задаться вопросом, как это возможно? Разве их свойство Binding
не должно быть связано с контекстом данных? Ну, это просто взломать. Привязка на самом деле не работает. На самом деле именно ячейки данных копируют / клонируют этот объект привязки и используют его для отображения собственного содержимого!
Итак, теперь, возвращаясь к решению вашей проблемы, я предполагаю, что HeaderItems
- это свойство объекта, которое установлено как DataContext
вашего родительского View. Мы можем соединить DataContext
вида с любым DataGridColumn
через то, что мы называем ProxyElement
.
В приведенном ниже примере показано, как подключить логический дочерний элемент, например ContextMenu
или DataGridColumn
, к родительскому представлению DataContext
<Window x:Class="WpfApplicationMultiThreading.Window5"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vb="http://schemas.microsoft.com/wpf/2008/toolkit"
Title="Window5" Height="300" Width="300" >
<Grid x:Name="MyGrid">
<Grid.Resources>
<FrameworkElement x:Key="ProxyElement" DataContext="{Binding}"/>
</Grid.Resources>
<Grid.DataContext>
<TextBlock Text="Text Column Header" Tag="Tag Columne Header"/>
</Grid.DataContext>
<ContentControl Visibility="Collapsed"
Content="{StaticResource ProxyElement}"/>
<vb:DataGrid AutoGenerateColumns="False" x:Name="MyDataGrid">
<vb:DataGrid.ItemsSource>
<x:Array Type="{x:Type TextBlock}">
<TextBlock Text="1" Tag="1.1"/>
<TextBlock Text="2" Tag="1.2"/>
<TextBlock Text="3" Tag="2.1"/>
<TextBlock Text="4" Tag="2.2"/>
</x:Array>
</vb:DataGrid.ItemsSource>
<vb:DataGrid.Columns>
<vb:DataGridTextColumn
Header="{Binding DataContext.Text,
Source={StaticResource ProxyElement}}"
Binding="{Binding Text}"/>
<vb:DataGridTextColumn
Header="{Binding DataContext.Tag,
Source={StaticResource ProxyElement}}"
Binding="{Binding Tag}"/>
</vb:DataGrid.Columns>
</vb:DataGrid>
</Grid>
</Window>
Приведенное выше представление обнаружило ту же ошибку привязки, которую вы обнаружили, если я не реализовал взлом ProxyElement. ProxyElement - это любой FrameworkElement, который крадет DataContext
из основного представления и предлагает его логическому дочернему элементу, например ContextMenu
или DataGridColumn
. Для этого он должен быть размещен как Content
в невидимом ContentControl
, который находится под тем же представлением.
Надеюсь, это направит вас в правильном направлении.