0

I want to create a custom gridview with header and filter in each column's header. I successfully created a GridViewColumnHeader template in WPF as below:

<Style TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GridViewColumnHeader}">
                    <Border BorderThickness="0,0,0,1" BorderBrush="Black" Background="Transparent">
                        <StackPanel Orientation="Vertical" Margin="1">
                            <TextBlock Padding="5,5,5,0" Text="{TemplateBinding Content}" Width="{TemplateBinding Width}" TextAlignment="Center" />
                            <TextBox x:Name="HeaderSearch" Padding="5,5,5,0" Width="{TemplateBinding Width}" TextAlignment="Center" />
                        </StackPanel>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="OverridesDefaultStyle" Value="True" />
        <Setter Property="Foreground" Value="Black" />
    </Style>

<ScrollViewer Grid.Column="1">
        <ListView>
            <ListView.View>
                <GridView >
                    <GridViewColumn Header="Code" Width="100"/>
                    <GridViewColumn Header="Name" Width="100"/>
                    <GridViewColumn Header="Description" Width="100"/>
                </GridView>
            </ListView.View>
        </ListView>
    </ScrollViewer>

How can I access the text-box in code behind?

Thanks in advance.

1 Answers1

0

Add GotFocus or Loaded event handler

<TextBox x:Name="HeaderSearch" Padding="5,5,5,0"
       Width="{TemplateBinding Width}" TextAlignment="Center" 
       GotFocus="HeaderSearch_GotFocus" />

TextBox CodeHeaderSearch;
TextBox NameHeaderSearch;

 private void HeaderSearch_GotFocus(object sender, RoutedEventArgs e)
 {
     TextBox t = sender as TextBox;
     var header = GetGridViewColumnHeader(t);
     if (header == "Code")
     {
         CodeHeaderSearch = sender as TextBox;
     }
     else if (header == "Name")
     {
         NameHeaderSearch = sender as TextBox;
     }
     // ....
 }

 private string GetGridViewColumnHeader(TextBox t)
 {
     var GridViewColumn = FindParent<GridViewColumnHeader>(t);
     return GridViewColumn.Column.Header as string;
 }

 public static T FindParent<T>(DependencyObject child) where T : DependencyObject
 {
     //get parent item
     DependencyObject parentObject = VisualTreeHelper.GetParent(child);

     //we've reached the end of the tree
     if (parentObject == null) return null;

     //check if the parent matches the type we're looking for
     T parent = parentObject as T;
     if (parent != null)
         return parent;
     else
         return FindParent<T>(parentObject);
 }
codeDom
  • 1,623
  • 18
  • 54
  • I am testing your soloution. It seems to be OK. – Mostafa Khodakarami Aug 17 '16 at 09:52
  • I couldn't work with your sample. But I gave your idea in writing event on load each textbox. I use loaded event and collect all textboxes to a textbox-array. So I have bind all textboxes to a collection. Now I have access to what I want. I accept your answer for your good idea. – Mostafa Khodakarami Aug 18 '16 at 07:37