2016-08-17 5 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 GotFocusまたはLoadedイベントハンドラを追加しますが、可能ではないthatsの。 –

+0

@Mostafa Khodakaramiこれを参照してくださいhttp://stackoverflow.com/questions/8126700/how-do-i-access-an-element-of-a-control-template-from-within-code-behind –

答えて

1

<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。それはOKであるようです。 –

+0

もしそうなら、この回答を受け入れてください。 – codeDom

+0

サンプルを扱うことができませんでした。しかし、私はあなたのアイデアを各テキストボックスをロードするイベントを書いてくれました。私はロードされたイベントを使用し、すべてのテキストボックスをテキストボックス配列に集めます。だから私はすべてのテキストボックスをコレクションにバインドしました。今私は自分が望むものにアクセスすることができます。私はあなたの良いアイデアのためにあなたの答えを受け入れます。 –

関連する問題