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
不是 Visual
或 Visual3D
,那是不可能的。
有什么想法吗?谢谢。
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
我希望我的程序的用户能够自己决定他们希望在我的 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
不是 Visual
或 Visual3D
,那是不可能的。
有什么想法吗?谢谢。
Is there any way to get the header of my
GridViewColumn
as aGridViewColumnHeader
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