TabItem/TabControl中的DataGridTextColumn标头绑定问题

本文关键字:绑定 问题 DataGridTextColumn TabControl 中的 TabItem | 更新日期: 2023-09-27 18:19:57

我在绑定DataGridTextColumn的头列时似乎遇到了问题。当我没有TabControl/TabItem包装它时,这段代码工作得很好,但当我把它放在TabControl中时,它再也找不到DayHeader了。我想这是FindAncestory/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',AncesorLevel='1'"的绑定的源。BindingExpression:Path=DataContext.DayHeader;DataItem=null;目标元素为"TextBlock"(名称=");目标属性是"文本"(类型为"字符串")

编辑:只有当我有一个包含多个TabItem的TabControl时,我才能重现这个错误。我已经更新了代码。很抱歉造成任何混淆,但添加其他TabItem会使DayHeader无法访问。

编辑2:我知道很多人使用Snoop来帮助他们解决绑定问题。当我用Snoop检查列标题时,当我高亮显示它们时,文本会神奇地出现。我不知道为什么这样做有效,所以希望对Snoop有更多了解的人能够提供帮助。下面是访问DayHeader的代码,也许这会有所帮助。

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

谢谢你的帮助。

TabItem/TabControl中的DataGridTextColumn标头绑定问题

DataGridTextColumn.Header不在可视化树中,因此它不在承载DataContext中。您可以使用Freezable类,如本文所示。