首页 文章

TabItem / TabControl中的DataGridTextColumn头绑定问题

提问于
浏览
1

我似乎在尝试绑定DataGridTextColumn的 Headers 列时遇到问题 . 当我没有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:路径= DataContext.DayHeader;的DataItem = NULL; target元素是'TextBlock'(Name =''); target属性是'Text'(类型'String')

编辑:当我有一个带有多个TabItem的TabControl时,我只能重现此错误 . 我已经更新了我的代码 . 很抱歉任何混乱,但添加其他TabItem是使DayHeader无法访问的原因 .

Edit2:我知道很多人使用Snoop来帮助他们解决绑定问题 . 好吧,当我用Snoop检查列 Headers 时,当我突出显示文本时,文本会神奇地出现 . 我不知道为什么这样有效,所以希望有更多关于Snoop知识的人能够提供帮助 . 这是访问DayHeader的代码,也许这会有所帮助 .

//Code Behind
 private string dayHeader;

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

谢谢你的帮助 .

1 回答

  • 3

    DataGridTextColumn.Header 不在可视化树中,因此它不会包含DataContext . 您可以使用 Freezable 类,如this文章中所示 .

相关问题