Relative Binding to DataGrid ItemsSource from TabHeaderItemTemplate not working

Viewed 18

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>
0 Answers
Related