WPF:如何找到我的列的 ColumnHeader?

WPF: How to find ColumnHeader to my Column?

我希望我的程序的用户能够自己决定他们希望在我的 ListView/GridView 中看到哪些列。

为此,我为 GridViewColumn 创建了两个附加属性,一个称为 IsColumnVisible 类型 Boolean(打开和关闭列的可见性),另一个称为LastWidth 类型 Double(保留该列最后一次可见时的宽度)。

属性 IsColumnVisible 确实有一个 OnChangedCallback
当 属性 设置为 False 时,我将列的当前宽度保存在 属性 LastWidth 并将当前宽度设置为 0.
当 属性 设置为 True 时,我从 属性 LastWidth 中获取列的最后一个宽度,并将当前宽度设置为该值。

这到目前为止有效,但有一个缺陷,可以用鼠标调整隐藏列的大小,使其再次可见。因此,如果您有三列并且隐藏了中间一列,则使用鼠标调整第一列的大小最终会使第二列再次可见。

为了摆脱它,我想将隐藏列的 header 的 IsEnabled 状态设置为 False,这就是问题开始的地方。

假设我的列在 XAML 中定义如下(第 1 列和第 4 列可见,第 2 列和第 3 列隐藏):

<GridView AllowsColumnReorder="True">
    <GridViewColumn Header="Column 1" Width="50" DisplayMemberBinding="{Binding Column1}" local:GridViewColumnConfig.IsColumnVisible="True" />
    <GridViewColumn Header="Column 2" Width="50" DisplayMemberBinding="{Binding Column2}" local:GridViewColumnConfig.IsColumnVisible="False" />
    <GridViewColumn Header="Column 3" Width="50" DisplayMemberBinding="{Binding Column3}" local:GridViewColumnConfig.IsColumnVisible="False">
        <GridViewColumn.Header>
            <GridViewColumnHeader Content="Column 4" />
        </GridViewColumn.Header>
    </GridViewColumn>
    <GridViewColumn Header="Column 4" Width="50" DisplayMemberBinding="{Binding Column4}" local:GridViewColumnConfig.IsColumnVisible="True" />
</GridView>

由于我的 属性 IsColumnVisible 的默认值是 True,因此我的 属性 的 OnChangedCallback 仅针对第 2 列和第 3 列运行。

我在 OnChangedCallback 中有一个 GridViewColumn 类型的 object 并且能够设置 header 列的 IsEnabled 状态我需要确定我的 GridViewColumn.
GridViewColumnHeader GridViewColumn 有一个 属性 Header 类型 Object。如果是第 2 列,这个 属性 包含 String "Column 2",如果是第 3 列,这个 属性 是 Nothing.

有什么方法可以让我的 GridViewColumn 的 header 变成 GridViewColumnHeader object 吗?

如果是第 2 列,我可以自己创建一个 GridViewColumnHeader object,将其 Content 设置为 Header 属性 的值,然后将 Header 属性 设置为此 object.
但如果没有必要,我宁愿不做这些改变。

对于第 3 列,某处应该已经有一个 GridViewColumnHeader object(因为我在 XAML 中定义了它),但我找不到它。
我已经尝试遍历视觉树,但由于 GridViewColumn 不是 VisualVisual3D,那是不可能的。

有什么想法吗?谢谢。

Is there any way to get the header of my GridViewColumn as a GridViewColumnHeader object?

最简单的方法是设置您的自定义附加值 属性 在您设置 Header 的值之后=27=].

如果您改用元素语法,您可以这样做:

<GridViewColumn Width="50" DisplayMemberBinding="{Binding Column3}" xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <GridViewColumn.Header>
        <GridViewColumnHeader Content="Column 4" />
    </GridViewColumn.Header>
    <local:GridViewColumnConfig.IsColumnVisible>
        <sys:Boolean>False</sys:Boolean>
    </local:GridViewColumnConfig.IsColumnVisible>
</GridViewColumn>

然后您就可以简单地将 Header 属性 转换为 PropertyChangedCallback 中的 GridViewColumnHeader:

Private Shared Sub OnPropertyChanged(d As GridViewColumn, e As DependencyPropertyChangedEventArgs)
    Dim header = TryCast(d.Header, GridViewColumnHeader)
    '...
End Sub