2

如何通过代码访问 wpf datagrid 列标题模板中的元素?

有一个解决方案,但我无法让它工作。

http://social.msdn.microsoft.com/Forums/en/wpf/thread/3237cb62-3a6a-4663-9f1e-7894cb24c674

其实我不知道是什么

Control.name 属性

标题

在上面的答案中?

4

2 回答 2

1

对于仍然有这个问题的人。

你有这个模板:

<DataTemplate x:Key="DataGridColumnHeaderTemplate">
    <StackPanel>
        <DockPanel x:Name="DockPanelFilter"></DockPanel>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding}"></TextBlock>
            <Image x:Name="ImageLock" Source="Resources/lock.png" Width="14" Height="14" Margin="2,0,0,0"></Image>
        </StackPanel>    
    </StackPanel>
</DataTemplate>

并且您想要访问 ImageLock 图像。你可以使用:

Public Shared BooAfterItemsPresenter As Boolean = False
Public Shared ColumnName As String = String.Empty
Public Shared Function FindVisualChildByName(Of T As DependencyObject)(parent As DependencyObject, name As String, columnNameI As String) As T
    Dim ColumnNameInput As String = columnNameI
    For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(parent) - 1
        Dim child = VisualTreeHelper.GetChild(parent, i)
        Dim controlName As String = TryCast(child.GetValue(Control.NameProperty), String)
        If TypeName(child) = "DataGridCellsPanel" Then
            BooAfterItemsPresenter = True
        End If
        If BooAfterItemsPresenter = True AndAlso TypeName(child) = "DataGridColumnHeader" Then
            Dim DGColHeader = CType(child, DataGridColumnHeader)
            If DGColHeader.Content IsNot Nothing Then
                ColumnName = DGColHeader.Content.ToString
            Else
                ColumnName = ""
            End If
        End If
        If controlName = name AndAlso ColumnName = ColumnNameInput Then
            Return TryCast(child, T)
        Else
            Dim result As T = FindVisualChildByName(Of T)(child, name, ColumnNameInput)
            If result IsNot Nothing Then
                Return result
            End If
        End If
    Next
    Return Nothing
End Function

然后当您使用此功能时:

Public Sub hideImageLock ()
        Dim ImageLock = FindVisualChildByName(Of Image)(dataGrid, "ImageLock", "NEU2")
        ImageLock.Visibility = Windows.Visibility.Collapsed
End Sub

我希望它可以帮助一些人!

于 2014-01-22T10:06:57.990 回答
0

Name 属性是您赋予该控件的名称。

在 xaml 中,您可以通过 x:Name 或简单地通过该控件的 Name 属性来指定它,如下所示。这意味着您正在创建一个名为 TextBox1 的 TextBox 类的对象。

<TextBox x:Name="TextBox1"/>
<TextBox Name="TextBox2"/>

在它后面的代码中是对象的名称

TextBox TextBox1 = new TextBox();

同样,Header 是 DataGridColumn 的属性。

我希望这将有所帮助。

于 2012-07-15T04:48:02.597 回答