2017-02-12 15 views
0

私のプログラムのユーザーは、ListView/GridViewで表示する列を自分で決定することができます。そのためWPF:ColumnHeaderを列に追加する方法

は、私は1つ(この列の幅を保持するタイプDoubleLastWidthと呼ばれ、他方(カラムとオフのトグル視認性)タイプBooleanIsColumnVisibleと呼ばれ、GridViewColumnための2つの添付プロパティを作成したときにそれを最後に見えた)。

プロパティIsColumnVisibleOnChangedCallbackです。
プロパティがFalseに設定されている場合、私は私の財産LastWidthの列の現在の幅を節約し、0
に現在の幅を設定するプロパティがTrueに設定されている場合、私は私から列の最後の幅を取得しますプロパティLastWidthに設定し、現在の幅をその値に設定します。

これまでのところ動作しますが、欠陥があると、マウスで非表示の列のサイズを変更して再び表示できるようになりました。したがって、3つの列があり、中間の列を非表示にすると、最初の列のサイズをマウスで変更すると、2番目の列が再び表示されます。

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

プロパティは、IがOnChangedCallbackタイプGridViewColumnのオブジェクトを持っていると私は私のGridViewColumnGridViewColumnHeaderを決定する必要が列ヘッダーのIsEnabled状態を設定できるように列2および3

に対して実行します。
GridViewColumnは、ObjectタイプのプロパティHeaderを持っています。列2の場合、このプロパティにはString "列2"が含まれ、列3の場合にはこのプロパティはNothingです。

私のGridViewColumnのヘッダをGridViewColumnHeaderオブジェクトとして取得する方法はありますか?コラム2の場合

私自身は、それがHeaderプロパティの値にContentだ設定し、このオブジェクトにHeaderプロパティを設定しGridViewColumnHeaderオブジェクトを作成することができます。
しかし、もし私がそうしなければ、これらの変更をしないでください。

カラム3の場合、すでにXAMLで定義しているので、GridViewColumnHeaderオブジェクトがあるはずですが、見つけられません。
すでにビジュアルツリーを歩いてみましたが、GridViewColumnVisualまたは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> 

を次にあなたは、単にあなたのPropertyChangedCallbackGridViewColumnHeaderHeaderプロパティをキャストすることができるようになります:

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プロパティの前に*設定されているためです。そのため、ヘッダープロパティがコールバックにNothingを返すのはこのためです。 – mm8

+0

私は、このアタッチされた振る舞いを使用するたびに要素構文を使用することを忘れないでください。自分自身を覚えておくよりも記憶したいと思っています。どうやって調達するかについての提案はありますか?私のプロパティがヘッダーの前に設定されている場合は例外ですか? – Nostromo

関連する問題