各列ヘッダーにボタンがあるデータグリッドがあります。XAML は次のとおりです。
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button x:Name="ExcelFilterButton"
Margin="0,0,0,0"
BorderThickness="0"
Click="ExcelFilterButton_Click"
Focusable="False"
Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"
Tag="{Binding}">
<Image Width="19"
Height="19"
Source="Resources\NoSortNoFilter.png"
Tag="{Binding}" />
</Button>
<TextBlock x:Name="ColumnName"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="{Binding}" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
ボタンを非表示にする必要がある特定の列があります。これらの列は並べ替え可能であってはなりません。ボタンを見つけるためにこのメソッドを書きました。そこに余分なコードを入れて、見つかったボタンとそのタグ値を確認できるようにしました。
Private Sub GetSortButton(Of T As DependencyObject)(dep As DependencyObject, Tag As String, ByRef out As T)
If dep IsNot Nothing Then
If TypeOf dep Is Button Then
Dim btn As Button = CType(dep, Button)
Debug.WriteLine("GetSortButton btn.Name: " & btn.Name & "; btn.Tag: " & btn.Tag)
If btn.Tag = Tag Then out = dep
Else
If VisualTreeHelper.GetChildrenCount(dep) > 0 Then
For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(dep) - 1
GetSortButton(Of T)(VisualTreeHelper.GetChild(dep, i), Tag, out)
Next
End If
End If
End If
End Sub
ボタンを非表示/表示する方法:
Public Sub SetStaticColumn(ColumnName As String, IsStatic As Boolean)
Dim btn As Button = Nothing
GetSortButton(Of Button)(dataGrid, ColumnName, btn)
Debug.WriteLine("btn is nothing: " & (btn Is Nothing).ToString)
If btn IsNot Nothing Then
btn.Visibility = If(IsStatic, Visibility.Collapsed, Visibility.Visible)
End If
End Sub
ここで、グリッドが最初に読み込まれるときに SetStaticColumn("Ex", True) を呼び出しますが、ボタンは Ex 列に表示されません (機能しました)。デバッグは次のようになります。
GetSortButton btn.Name: ExcelFilterButton; btn.Tag: Ex
GetSortButton Tag 'Ex' found.
しかし、更新されたデータを表示するためにグリッドがリロードされると、Ex 列のボタンが再び表示されます (機能しませんでした)。そしてデバッグは示します:
GetSortButton btn.Name: ; btn.Tag:
btn is nothing: True
そのため、この時点ではボタンに Tag 値がなかったようで、見つかりませんでした。バインディングはいつ行われますか?DataGrid.ItemsSource を設定した後、DataGrid.Loaded イベント ハンドラーでも DataGrid.AutoGeneratingColumn イベント ハンドラーでもメソッドを呼び出してみました。リロード後にボタンを非表示にする唯一の方法は、メソッドを呼び出すボタンを作成し、グリッドのリロード後にそのボタンをクリックすることです。この時点で私は困惑しています。
任意の提案をいただければ幸いです。