0

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

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

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

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

为了摆脱这种情况,我想将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>

由于 my 属性的默认值为 ,IsColumnVisible因此该属性的TruemyOnChangedCallback仅针对第 2 列和第 3 列运行。

我有一个类型的对象,GridViewColumn并且OnChangedCallback能够设置IsEnabled列标题的状态,我需要确定GridViewColumnHeader我的GridViewColumn.
AGridViewColumn具有Header类型的属性Object。在第 2 列的情况下,此属性包含String“第 2 列”,在第 3 列的情况下,此属性为Nothing

有什么方法可以将 my 的标题GridViewColumn作为GridViewColumnHeader对象?

在第 2 列的情况下,我可以自己创建一个GridViewColumnHeader对象,将其设置为属性Content的值,Header然后将Header属性设置为该对象。
但如果我不需要,我宁愿不做这些改变。

在第 3 列的情况下,某处应该已经有一个GridViewColumnHeader对象(因为我在 XAML 中定义了它),但我找不到它。
我已经尝试走可视化树,但由于GridViewColumn不是 aVisual或 a Visual3D,那是不可能的。

有任何想法吗?谢谢你。

4

1 回答 1

1

有什么方法可以将 my 的标题GridViewColumn作为GridViewColumnHeader对象?

最简单的方法是在设置属性值设置自定义附加属性的值Header

如果您切换到使用元素语法,则可以这样做:

<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属性转换为GridViewColumnHeader您的a PropertyChangedCallback

Private Shared Sub OnPropertyChanged(d As GridViewColumn, e As DependencyPropertyChangedEventArgs)
    Dim header = TryCast(d.Header, GridViewColumnHeader)
    '...
End Sub
于 2017-02-12T14:34:54.350 回答