2017-02-12 19 views
0

내 프로그램의 사용자가 내 ListView/GridView에서보고 싶은 열을 스스로 결정할 수 있기를 바랍니다. 이를 위해WPF : 내 열에 ColumnHeader를 찾는 방법?

는 I 하나 (이 열의 폭을 유지 유형 DoubleLastWidth라고하고, 다른 하나 (에 열 및 오프 전환 공개) 형 BooleanIsColumnVisible라고, GridViewColumn 두 부착 특성을 만들 때 그것을 마지막으로 보았습니다).

속성 IsColumnVisibleOnChangedCallback입니다. 속성이 False로 설정하면
, 나는 속성이 True로 설정하면, 내가로부터 열의 마지막 폭을 얻을 내 재산 LastWidth의 열의 현재 폭을 저장하고 0
현재 너비를 설정 내 속성 LastWidth을 입력하고 현재 너비를 해당 값으로 설정합니다.

이것은 지금까지는 작동하지만 결함으로 인해 마우스로 숨겨진 열의 크기를 다시 조정할 수 있습니다. 따라서 세 개의 열이 있고 가운데 열을 숨기는 경우 마우스로 첫 번째 열의 크기를 조정하면 두 번째 열이 다시 표시됩니다.

IsEnabled 상태를 숨겨진 열 머리글의 상태를 False으로 설정하려면이 문제를 해결해야합니다.

의 내 열이 (숨겨진 열 1과 4 볼, 열 2, 3)과 같은 XAML에 정의되어 있다고 가정 해 봅시다 : 내 재산 IsColumnVisible의 기본 값이 내 OnChangedCallbackTrue 때문에

<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> 

속성은 내가 OnChangedCallback 입력 GridViewColumn의 객체를 가지고 내 GridViewColumnGridViewColumnHeader을 결정하는 데 필요한 열 머리글의 IsEnabled 상태를 설정 할 수 있도록 열 2

3. 동안 실행 .
GridViewColumn의 유형은 ObjectHeader입니다. 열 2의 경우이 속성에는 String "열 2"가 포함되며 열 3의 경우이 속성은 Nothing입니다.

GridViewColumn의 헤더를 GridViewColumnHeader 개체로 가져 오는 방법이 있습니까?

열 2의 경우 나는 그것이 Header 속성 값에 Content있어 설정 한 다음이 객체에 Header 속성을 설정하는 GridViewColumnHeader 객체에게 자신을 만들 수 있습니다.
하지만 그럴 필요가 없다면 이러한 변경을하지 않을 것입니다.

3 열의 경우 이미 XAML에서 정의한 바대로 GridViewColumnHeader 개체가 있어야하지만 찾을 수 없습니다.
이미 시각 트리를 걸려고했지만 GridViewColumnVisual 또는 Visual3D이 아니기 때문에 불가능합니다.

아이디어가 있으십니까? 고맙습니다.

답변

1

GridViewColumn의 헤더를 GridViewColumnHeader 개체로 가져 오는 방법이 있습니까?

당신이 Header 속성 값을 설정 한 후 사용자 지정 연결된 속성 의 값을 설정하는 것이 작업을 수행하는 가장 쉬운 방법.

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

그래서, 거기 :

<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> 

그런 다음 당신은 단순히 당신의 PropertyChangedCallbackGridViewColumnHeaderHeader 속성을 시전 할 수있을 것입니다 : 당신이 요소 구문을 사용하도록 전환 할 경우

이 작업을 수행 할 수 사실 열 머리글에 대한 속성 구문을 사용할 때 내재 된 GridViewColumnHeader가 없습니다 (2 열과 같이)? – Nostromo

+0

문제는 특성 구문을 사용할 때 Header 속성이 IsColumnVisible 속성보다 * 앞에 설정되어 있기 때문에 Header 속성이 콜백에서 Nothing을 반환하는 이유입니다. – mm8

+0

나는이 애플릿을 사용할 때마다 요소 구문을 사용하는 것을 잊지 않고 나 자신을 기억하는 것보다 기억하고 싶기 때문에 ... 어떻게 또는 어디에 올릴 지에 대한 제안이 있습니까? 내 속성이 헤더 앞에 설정된 경우 예외가 있습니까? – Nostromo