在WPF itemscontrol中find控件

您好我有几个文本框内的itemcontrol控件的datatemplate。 当我绑定itemcontrols到一个可观察的集合我得到两个文本框。 但我需要做一些基于每个文本框,我想find每个文本使用一些ID分隔的操纵。

任何人都可以帮助如何findWPF中items控件的控件。

使用ItemContainerGenerator,您可以获取项目的生成容器,并向下遍历可视化树以find您的TextBox。 在一个ItemsControl的情况下,它将是一个ContentPresenter,但是一个ListBox将返回一个ListBoxItem,ListView和一个ListViewItem等。

ContentPresenter cp = itemsControl.ItemContainerGenerator.ContainerFromItem(item) as ContentPresenter; TextBox tb = FindVisualChild<TextBox>(cp); if (tb != null) { // do something with tb } public static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject { if (depObj != null) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) { DependencyObject child = VisualTreeHelper.GetChild(depObj, i); if (child != null && child is T) { return (T)child; } T childItem = FindVisualChild<T>(child); if (childItem != null) return childItem; } } return null; } 

你也可以通过索引获得容器,如果你想要使用

 itemsControl.ItemContainerGenerator.ContainerFromIndex(0); 

感谢布莱斯,我试图剔上向上的箭头,但它说我的评级太低! 抱歉!

我修改了代码,以返回给定types的所有孩子的所有列表,因为这是我所需要的,并认为其他人可能会觉得它有用。

再次感谢布莱斯,真的很有帮助 – 对评级的事情感到抱歉!

 public static List<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject { List<T> list = new List<T>(); if (depObj != null) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) { DependencyObject child = VisualTreeHelper.GetChild(depObj, i); if (child != null && child is T) { list.Add((T)child); } List<T> childItems = FindVisualChildren<T>(child); if (childItems != null && childItems.Count() > 0) { foreach (var item in childItems) { list.Add(item); } } } } return list; } 

您可能想尝试使用VisualTreeHelper 。 ItemsControl本身的属性将只允许你获取绑定的数据,而不是用于可视化数据的模板实例,而VisualTreeHelper允许你在WPF显示的时候浏览可视树。

如果您迭代通过父级ItemControl的可视子元素(recursion),您不应该有任何困难定位在屏幕上看到的文本框。

另一个例子:

  private void DataGridBank_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) { try { switch (e.Key) { case Key.Down: if ((DataGridBank.SelectedIndex + 1) <= DataGridBank.Items.Count) { DataGridBank.SelectedIndex = DataGridBank.SelectedIndex + 1; FocusCell(); } break; case Key.Up: if ((DataGridBank.SelectedIndex - 1) >= 0) { DataGridBank.SelectedIndex = DataGridBank.SelectedIndex - 1; FocusCell(); } break; case Key.Enter: case Key.Tab: FocusCell(); break; } } catch (Exception ex) { } } private void DataGridBank_Loaded(object sender, RoutedEventArgs e) { try { if (DataGridBank.Items.Count > 0) { DataGridBank.SelectedIndex = 0; FocusCell(); } }catch(Exception ex) { } } private void FocusCell() { var selectedRow = (DataGridRow)DataGridBank.ItemContainerGenerator.ContainerFromItem(DataGridBank.SelectedItem); var textImport = FindVisualChild<TextBox>(selectedRow); textImport.Focus(); textImport.SelectAll(); } public static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject { if (depObj != null) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) { DependencyObject child = VisualTreeHelper.GetChild(depObj, i); if (child != null && child is T) { return (T)child; } T childItem = FindVisualChild<T>(child); if (childItem != null) return childItem; } } return null; } 

如果您有包含数据模板的数据网格和模板列,则可以使用以下代码示例

 <DataGridTemplateColumn x:Name="photoPathColumn" Header="{x:Static resx:FrmResource.Photo}"> <DataGridTemplateColumn.CellEditingTemplate x:Uid="keyelm"> <DataTemplate x:Name="dodo"> <StackPanel Orientation="Horizontal" Height="Auto"> <TextBlock x:Name="photo" x:Uid="imageFile" Text="{Binding Path=PhotoPath}" /> <Button x:Name="Browse" Content="..." Click="Browse_Click" /> </StackPanel> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> photoPathColumn.CellEditingTemplate.FindName("photo",photoPathColumn.GetCellContent(CustomersDataGrid.CurrentItem))