I am trying to bind a TabItemHeaderTemplate to the DataGrid ItemsSource inside the TabItem and able to do so when using StaticResources (as shown below) but I have so far been unable to use a relative binding to save me defining individual templates for all TabItemHeaders.
Below is an excerpt of my (relevant) XAML:
<UserControl>
<UserControl.Resources>
<!-- CollectionViewSources below are filtered using Markup Extension, but left it out here to keep example more condensed -->
<CollectionViewSource x:Key="ScopeA" Source="{Binding Checklist.Checks}" />
<CollectionViewSource x:Key="ScopeB" Source="{Binding Checklist.Checks}" />
<!-- Display summary of checks -->
<CollectionViewSource x:Key="ScopeC" Source="{Binding Checklist.Checks}" Filter="ScopeCFilter" />
<local:HasFailureConverter x:Key="StatusHasFailureConverter"/>
<!-- ... -->
<DataTemplate x:Key="TabItemContentTemplate">
<DataGrid
AutoGenerateColumns="False"
ItemsSource="{Binding}"
IsReadOnly="True"
HeadersVisibility="None"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
RowDetailsVisibilityMode="Visible">
<DataGrid.Columns>
<DataGridTextColumn Header="F" Binding="{Binding F}" CellStyle="{StaticResource TestResultDataGridCellStatusStyle}"/>
<DataGridTextColumn Header="G" Binding="{Binding G}" Width="*"/>
<DataGridHyperlinkColumn Binding="{Binding H}">
<DataGridHyperlinkColumn.ElementStyle>
<Style>
<EventSetter Event="Hyperlink.Click" Handler="Hyperlink_Click"/>
</Style>
</DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid
AutoGenerateColumns="False"
ItemsSource="{Binding Results}"
IsReadOnly="True"
HeadersVisibility="Column"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ActualWidth}">
<DataGrid.Columns>
<DataGridTextColumn Header="A" Binding="{Binding A}" CellStyle="{StaticResource TestResultDataGridCellStatusStyle}"/>
<DataGridTextColumn Header="B" Binding="{Binding B}" Width="*" />
<DataGridTextColumn Header="C" Binding="{Binding C}" />
<DataGridTextColumn Header="D" Binding="{Binding D}" />
<DataGridTextColumn Header="E" Binding="{Binding E}" Width="*" />
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
</DataTemplate>
<DataTemplate x:Key="TabItemHeaderWithIconTemplate" >
<StackPanel Orientation="Horizontal">
<Image Width="16px" RenderOptions.BitmapScalingMode="HighQuality" Margin="-2 1 3 0">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Value="True" Binding="{Binding Source={StaticResource FinalCheckScope}, Converter={StaticResource StatusHasFailureConverter}, Mode=OneWay}">
<Setter Property="Source" Value="/Resources/red-x-icon.png"/>
</DataTrigger>
<DataTrigger Value="False" Binding="{Binding Source={StaticResource FinalCheckScope}, Converter={StaticResource StatusHasFailureConverter}, Mode=OneWay}">
<Setter Property="Source" Value="/Resources/green-checkmark-icon.png"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<TextBlock Text="{Binding}" />
</StackPanel>
</DataTemplate>
</UserControl.Resources>
<Grid>
<TabControl Grid.Row="2" Grid.ColumnSpan="2">
<TabItem Header="A" ContentTemplate="{StaticResource TabItemContentTemplate}" HeaderTemplate="{StaticResource TabItemHeaderWithIconTemplate}" Content="{Binding Source={StaticResource ScopeA}}" />
<TabItem Header="B" ContentTemplate="{StaticResource TabItemContentTemplate}" HeaderTemplate="{StaticResource TabItemHeaderWithIconTemplate}" Content="{Binding Source={StaticResource ScopeB}}" />
<TabItem Header="C" ContentTemplate="{StaticResource TabItemContentTemplate}" HeaderTemplate="{StaticResource TabItemHeaderWithIconTemplate}" Content="{Binding Source={StaticResource ScopeC}}" />
</TabControl>
</Grid>
I have tried binding to TemplatedParent but than my Filter in code behind receives a ContentPresenter object in value instead of a ListCollectionView.
I have also tried to bind to DataContext.ItemSource of the relative DataGrid like below, all to no avail as the filter seems not even triggered when debugging my code:
<DataTrigger Value="True" Binding="{Binding Path=DataContext.ItemsControl, RelativeSource={RelativeSource AncestorType=DataGrid}, Converter={StaticResource StatusHasFailureConverter}, Mode=OneWay}">
<Setter Property="Source" Value="/Resources/red-x-icon.png"/>
</DataTrigger>
<DataTrigger Value="False" Binding="{Binding Path=DataContext.ItemsControl, RelativeSource={RelativeSource AncestorType=DataGrid}, Converter={StaticResource StatusHasFailureConverter}, Mode=OneWay}">
<Setter Property="Source" Value="/Resources/green-checkmark-icon.png"/>
</DataTrigger>