Я хочу, чтобы пользователи моей программы могли сами решить, какие столбцы они хотели бы видеть в моем ListView/GridView.WPF: Как найти ColumnHeader в моей колонке?
Для этого я создал два прикрепленных свойства для 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>
Поскольку значение по умолчанию моей собственности IsColumnVisible
является True
, мой OnChangedCallback
этого свойство работает только для столбцов 2 и 3.
у меня есть объект типа GridViewColumn
в OnChangedCallback
и быть в состоянии установить IsEnabled
состояние заголовка столбца мне нужно, чтобы определить GridViewColumnHeader
моего GridViewColumn
,
A GridViewColumn
имеет свойство Header
типа Object
. В случае столбца 2 это свойство содержит String
«Столбец 2», в случае столбца 3 это свойство равно Nothing
.
Есть ли способ получить заголовок моего GridViewColumn
как объекта GridViewColumnHeader
?
В случае колонке 2 я мог бы создать GridViewColumnHeader
объект сам, установить его Content
к стоимости Header
имущества, а затем установить Header
свойство этого объекта.
Но я бы предпочел не делать эти изменения, если мне это не нужно.
В случае столбца 3 здесь должен быть объект GridViewColumnHeader
(так как я определил его в XAML), но я не могу его найти.
Я уже пытался пройти визуальное дерево, но с GridViewColumn
не является Visual
или Visual3D
, это невозможно.
Любые идеи? Спасибо.
Итак, есть на самом деле не подразумевается GridViewColumnHeader, когда я использую синтаксис атрибута для заголовка (как в столбце 2)? – Nostromo
Проблема заключается в том, что свойство Header устанавливается * перед * свойством IsColumnVisible, когда вы используете синтаксис атрибутов, и поэтому свойство Header возвращает Nothing в вашем обратном вызове. – mm8
Поскольку я должен был бы не раз использовать синтаксис элемента каждый раз, когда я хочу использовать это приложенное поведение, и так как я больше хотел бы помнить, чем помнить себя ... есть ли у вас какие-либо предложения о том, как или где поднять исключение, если мое свойство задано перед заголовком? – Nostromo