2016-08-17 66 views
0

我想在每一列的標題中創建一個含有header and filter的自定義gridview。我在WPF中成功創建了一個GridViewColumnHeader模板,如下所示:如何訪問GridViewColumnHeader模板中的文本框

<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> 

如何訪問後面代碼中的文本框?

在此先感謝。

+0

@StefanKert,那是不可能的。 –

+0

@莫斯塔法Khodakarami請參閱這個http://stackoverflow.com/questions/8126700/how-do-i-access-an-element-of-a-control-template-from-within-code-behind –

回答

1

添加GotFocusLoaded事件處理

<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); 
} 
+0

我正在測試你的soloution。這似乎是好的。 –

+0

如果是這樣,請接受此答案。 – codeDom

+0

我無法處理您的示例。但是我在寫入每個文本框的事件時都給出了你的想法。我使用加載的事件並將所有文本框收集到文本框數組中。所以我將所有文本框綁定到一個集合。現在我可以訪問我想要的東西。我接受你的答案是你的好主意。 –