【问题标题】:How to access the elements inside wpf datagrid column header template?如何访问 wpf datagrid 列标题模板中的元素?
【发布时间】:2012-07-15 04:33:02
【问题描述】:

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

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

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

其实我不知道是什么

控件名称属性

标题

在上面的答案中?

【问题讨论】:

    标签: wpf datatemplate wpfdatagrid


    【解决方案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
    

    希望对大家有所帮助!

    【讨论】:

      【解决方案2】:

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

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

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

      后面的代码是对象的名称

      TextBox TextBox1 = new TextBox();
      

      同样,Header 是 DataGridColumn 的属性。

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2013-06-04
        • 2014-10-22
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多