【问题标题】:How to acess text box in GridViewColumnHeader template如何访问 GridViewColumn 标题模板中的文本框
【发布时间】:2016-08-17 06:48:52
【问题描述】:

我想在每列的标题中创建一个带有header and filter 的自定义gridview。我在 WPF 中成功创建了一个 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>

如何访问后面代码中的文本框?

提前致谢。

【问题讨论】:

标签: c# wpf templates gridview


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

【讨论】:

  • 我正在测试你的解决方案。好像没问题。
  • 我无法处理您的样本。但是我在加载每个文本框时给出了你的想法。我使用加载的事件并将所有文本框收集到一个文本框数组。所以我已经将所有文本框绑定到一个集合。现在我可以访问我想要的东西了。我接受你的好主意。
猜你喜欢
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 2019-03-07
  • 2015-11-25
相关资源
最近更新 更多