GridViewColumn标题绑定在样式中失败

本文关键字:失败 样式 标题 绑定 GridViewColumn | 更新日期: 2023-09-27 18:18:26

我有一个ListView,其中视图包含一个GridView和一些列定义。如下:

<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>

我需要隐藏用户首选项上的第一列,所以我创建了一个样式触发器来完成这个任务。带有样式触发器的代码如下

<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>

当使用此样式时,GridViewColumn Header属性的绑定不起作用

但是CellTemplate的Binding可以正确显示。

VS的输出窗口显示这个错误

System.Windows。数据错误:2:找不到目标元素的框架元素或框架内容元素。BindingExpression:路径= ColumnHeader1;DataItem =零;目标元素是'GridViewColumn' (HashCode=56585823);目标属性为'Header'(类型为'Object ')

有人能解释一下为什么会发生这种情况以及如何解决吗?

尝试的东西:

  • 使用RelativePath绑定确保DataContext是有效的。(怀疑这并不工作,因为我认为GridViewColumn定义

  • 为HeaderTemplate创建一个DataTemplate:相同的结果

  • 使用FrameWorkElement作为代理

GridViewColumn标题绑定在样式中失败

如果其他人有这样的问题,我已经找到了解决方案。

GridViewColumn Header属性必须在该项的XAML标记中设置和绑定,如下所示。

<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>

如果您遇到类似的问题,希望这将对您有所帮助。