我似乎在尝试绑定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:无法找到带引用的绑定源&#39; RelativeSource FindAncestor,AncestorType =&#39; System.Windows.Controls.DataGrid&#39;,AncestorLevel =&#39; 1& #39;&#39 ;. BindingExpression:路径= DataContext.DayHeader;的DataItem = NULL;目标元素是&#39; TextBlock&#39; (名称=&#39;&#39);目标属性是&#39; Text&#39; (键入&#39; String&#39;)
编辑:当我有一个带有多个TabItem的TabControl时,我只能重现此错误。我已经更新了我的代码。很抱歉有任何混淆,但添加其他TabItem是导致DayHeader无法访问的原因。
Edit2:我知道很多人使用Snoop来帮助他们解决绑定问题。好吧,当我用Snoop检查列标题时,当我突出显示文本时,文本会神奇地出现。我不知道为什么这样有效,所以希望有更多关于Snoop知识的人能够提供帮助。以下是访问DayHeader的代码,可能会有所帮助。
//Code Behind
private string dayHeader;
public string DayHeader
{
get { return dayHeader; }
set
{
dayHeader = value;
NotifyOfPropertyChange(() => DayHeader);
}
}
感谢您的帮助。