3
votes

I have a ListView where the View contains a GridView and a number of column definitions. As Below:

<ListView Name="SampleListView" ItemsSource="{Binding SomeSource}" >
        <ListView.View>
            <GridView AllowsColumnReorder="False">
                <GridViewColumn Header="{Binding ColumnHeader1,Mode=OneWay}" CellTemplate="{StaticResource Column1Template}" />
                <GridViewColumn Header="{Binding ColumnHeader2,Mode=OneWay}" CellTemplate="{StaticResource Column2Template}" />
                <GridViewColumn Header="{Binding ColumnHeader3,Mode=OneWay}" CellTemplate="{StaticResource Column3Template}" />
                <GridViewColumn Header="{Binding ColumnHeader4,Mode=OneWay}" CellTemplate="{StaticResource Column4Template}" />
                <GridViewColumn Header="{Binding ColumnHeader5,Mode=OneWay}" CellTemplate="{StaticResource Column5Template}" />
            </GridView>
        </ListView.View>
    </ListView>

(This works perfectly)

I have a requirement to hide the first column on a user preference so I created a Style Trigger to accomplish this. The code with the style trigger is as below

<ListView Name="SampleListView" ItemsSource="{Binding SomeSource}" >
        <ListView.Resources>
            <Style x:Key="{x:Type ListView}" TargetType="ListView">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Source={x:Static p:User.Default},Path=ShowColumn1,Mode=OneWay}" Value="False">
                        <Setter Property="View">
                            <Setter.Value>
                                <GridView x:Name="WithOutColumn1" AllowsColumnReorder="False">
                                        <GridViewColumn Header="{Binding ColumnHeader2,Mode=OneWay}" CellTemplate="{StaticResource Column2Template}" />
                                        <GridViewColumn Header="{Binding ColumnHeader3,Mode=OneWay}" CellTemplate="{StaticResource Column3Template}" />
                                        <GridViewColumn Header="{Binding ColumnHeader4,Mode=OneWay}" CellTemplate="{StaticResource Column4Template}" />
                                        <GridViewColumn Header="{Binding ColumnHeader5,Mode=OneWay}" CellTemplate="{StaticResource Column5Template}" />
                                    </GridView>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Source={x:Static p:User.Default},Path=ShowColumn1,Mode=OneWay}" Value="True">
                        <Setter Property="View">
                            <Setter.Value>
                                <GridView x:Name="WithColumn1"  AllowsColumnReorder="False">
                                        <GridViewColumn Header="{Binding ColumnHeader1,Mode=OneWay}" CellTemplate="{StaticResource Column1Template}" />
                                        <GridViewColumn Header="{Binding ColumnHeader2,Mode=OneWay}" CellTemplate="{StaticResource Column2Template}" />
                                        <GridViewColumn Header="{Binding ColumnHeader3,Mode=OneWay}" CellTemplate="{StaticResource Column3Template}" />
                                        <GridViewColumn Header="{Binding ColumnHeader4,Mode=OneWay}" CellTemplate="{StaticResource Column4Template}" />
                                        <GridViewColumn Header="{Binding ColumnHeader5,Mode=OneWay}" CellTemplate="{StaticResource Column5Template}" />
                                </GridView>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ListView.Resources>
    </ListView>

When this style is used the Binding for the GridViewColumn Header property does not work.

But the Binding for the CellTemplate does and displays correctly.

The Output Window in VS Shows this Error

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=ColumnHeader1; DataItem=null; target element is 'GridViewColumn' (HashCode=56585823); target property is 'Header' (type 'Object

Can anyone shed some light on why this occurs and how to resolve it?

Things Tried:

  • Using a RelativePath binding to ensure the DataContext is valid. (Suspect this doesn't work as i think the GridViewColumn definition exists outside the visual tree from this post Here)

  • Creating a DataTemplate for the HeaderTemplate : Same result.

  • Using an FrameWorkElement as a Proxy as per this post Here

1

1 Answers

4
votes

In Case anyone else is having an issue like this i have found a resolution.

The GridViewColumn Header property must be set and bound within XAML tags for that item as below.

<Setter Property="View">
<Setter.Value>
    <GridView x:Name="WithOutColumn1" AllowsColumnReorder="False">
        <GridViewColumn CellTemplate="{StaticResource Column2Template}">
            <GridViewColumnHeader Content="{Binding ColumnHeader2}" />
        </GridViewColumn>
        <GridViewColumn CellTemplate="{StaticResource Column3Template}">
            <GridViewColumnHeader Content="{Binding ColumnHeader3}" />
        </GridViewColumn>
        <GridViewColumn  CellTemplate="{StaticResource Column4Template}">
            <GridViewColumnHeader Content="{Binding ColumnHeader3}" />
        </GridViewColumn>
        <GridViewColumn  CellTemplate="{StaticResource Column5Template}">
            <GridViewColumnHeader Content="{Binding ColumnHeader3}" />
        </GridViewColumn>
    </GridView>
</Setter.Value>

Hope fully this will be helpful if you encounter a similar issue.