Проблема привязки заголовка DataGridTextColumn в TabItem/TabControl

Кажется, у меня возникают проблемы при попытке связать столбец заголовка DataGridTextColumn. Этот код прекрасно работает, когда у меня нет TabControl/TabItem, обертывающего его, но когда я помещаю его в TabControl, он больше не может найти DayHeader. Я предполагаю, что это проблема с FindAncestor/AncestoryType, но я не уверен, что нужно сделать, чтобы это исправить, или это действительно проблема. Любая помощь будет оценена.

<!--Not Working
<TabControl Margin="0,25,0,0" Background="{x:Null}">
    <TabItem >
        <Grid >
            <DataGrid></DataGrid>
        </Grid>
    </TabItem>
    <TabItem Header="Test Header">-->

<!--Working-->
<Grid>
    <DataGrid ItemsSource="{Binding RunningViewSource.View}" Margin="0,27,0,-5" SelectionMode="Single">
        <DataGrid.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel VirtualizingStackPanel.VirtualizationMode="Recycling" />
            </ItemsPanelTemplate>
         </DataGrid.ItemsPanel>
         <DataGrid.Columns>
             <DataGridTextColumn Header="Contingencies" Binding="{Binding Contingencies}"
                                            IsReadOnly="True" Width="400" />
             <DataGridTextColumn Binding="{Binding Days[4]}" CellStyle="{StaticResource NumberCell}">
                 <DataGridTextColumn.Header>
                     <TextBlock Text="{Binding DataContext.DayHeader, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}">
                     </TextBlock>
                  </DataGridTextColumn.Header>
             </DataGridTextColumn>
         </DataGrid.Columns>
     </DataGrid>
</Grid>

<!--Not Working
    </TabItem>
</TabControl>-->

Это сообщение я получаю в окне вывода, если добавляю нерабочие части.

Ошибка System.Windows.Data: 4: Не удается найти источник для привязки со ссылкой 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid', AncestorLevel='1''. BindingExpression:Path=DataContext.DayHeader; DataItem= NULL; целевым элементом является TextBlock (Name=''); Свойство target - "Текст" (тип "Строка").

Изменить: я могу воспроизвести эту ошибку, только если у меня есть TabControl с более чем одним TabItem. Я обновил свой код Извините за путаницу, но добавление другого TabItem делает DayHeader недоступным.

Edit2: я знаю, что многие люди используют Snoop, чтобы помочь им с проблемами связывания. Хорошо, когда я проверяю заголовки столбцов с помощью Snoop, текст волшебным образом появляется, когда я их подсвечиваю. Я понятия не имею, почему это работает, так что надеюсь, кто-то с большим знанием о Snoop сможет помочь. Вот код для доступа к DayHeader и, возможно, это поможет.

//Code Behind
 private string dayHeader;

    public string DayHeader
    {
        get { return dayHeader; }
        set
        {
            dayHeader = value;
            NotifyOfPropertyChange(() => DayHeader);
        }
    }

Спасибо за любую помощь.

1 ответ

Решение

DataGridTextColumn.Header не находится в визуальном дереве, поэтому он не наследует DataContext. Вы можете использовать Freezable класс, как показано в этой статье.

Другие вопросы по тегам