【问题标题】:GridViewColumn Header Binding Fails When In A StyleGridViewColumn 标题绑定在样式中失败
【发布时间】:2013-06-09 19:37:39
【问题描述】:

我有一个 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 定义 存在于这篇帖子的视觉树之外Here)

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

  • 根据这篇文章Here使用 FrameWorkElement 作为代理@

【问题讨论】:

    标签: c# wpf gridview binding visual-studio-2012


    【解决方案1】:

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

    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>
    

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

    【讨论】:

    • 感谢发帖。我遇到了完全相同的问题,这为我解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2014-03-12
    • 2015-03-14
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多