2017-02-12 2 views
0

Я хочу, чтобы пользователи моей программы могли сами решить, какие столбцы они хотели бы видеть в моем 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, это невозможно.

Любые идеи? Спасибо.

ответ

1

Есть ли способ получить заголовок моего 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 в вашем PropertyChangedCallback:

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

Итак, есть на самом деле не подразумевается GridViewColumnHeader, когда я использую синтаксис атрибута для заголовка (как в столбце 2)? – Nostromo

+0

Проблема заключается в том, что свойство Header устанавливается * перед * свойством IsColumnVisible, когда вы используете синтаксис атрибутов, и поэтому свойство Header возвращает Nothing в вашем обратном вызове. – mm8

+0

Поскольку я должен был бы не раз использовать синтаксис элемента каждый раз, когда я хочу использовать это приложенное поведение, и так как я больше хотел бы помнить, чем помнить себя ... есть ли у вас какие-либо предложения о том, как или где поднять исключение, если мое свойство задано перед заголовком? – Nostromo

Смежные вопросы