3

我有一个 ListView,其中 View 包含一个 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 的绑定可以正确显示。

VS 中的输出窗口显示此错误

System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。绑定表达式:路径=ColumnHeader1;数据项=空;目标元素是 'GridViewColumn' (HashCode=56585823); 目标属性是“标题”(类型“对象

任何人都可以解释为什么会发生这种情况以及如何解决它?

尝试的事情:

  • 使用 RelativePath 绑定来确保 DataContext 有效。(怀疑这不起作用,因为我认为 GridViewColumn 定义存在于这篇文章的视觉树之外)

  • 为 HeaderTemplate 创建 DataTemplate :结果相同。

  • 根据这篇文章在此处使用 FrameWorkElement 作为代理

4

1 回答 1

4

万一其他人遇到这样的问题,我已经找到了解决方案。

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>

如果您遇到类似的问题,完全希望这会有所帮助。

于 2013-06-14T08:39:19.733 回答