1

各列ヘッダーにボタンがあるデータグリッドがあります。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 イベント ハンドラーでもメソッドを呼び出してみました。リロード後にボタンを非表示にする唯一の方法は、メソッドを呼び出すボタンを作成し、グリッドのリロード後にそのボタンをクリックすることです。この時点で私は困惑しています。

任意の提案をいただければ幸いです。

4

0 に答える 0