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

时间:2012-07-15 04:33:02

标签: wpf datatemplate wpfdatagrid

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

有一个解决方案,但我无法使其发挥作用。

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

实际上我不知道什么

  

Control.nameproperty

  

标题

在上面的答案中?

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

Name属性是您为该Control提供的名称。

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

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

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

TextBox TextBox1 = new TextBox();

类似地,Header是DataGridColumn的属性。

我希望这会有所帮助。