在WPF项目控件中查找控件

dee*_*pak 22 wpf findcontrol itemscontrol

嗨,我在itemscontrol的datatemplate中只有一个文本框.当我将itemcontrols绑定到一个可观察的集合时,我得到两个文本框.但我需要根据每个文本框进行一些操作,我希望使用一些id分别找到每个文本框.

任何人都可以帮助如何在WPF中的itemscontrol中找到控件.

Bry*_*hle 68

使用ItemContainerGenerator,您可以获取项目的生成容器,并向下遍历可视树以查找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;
}
Run Code Online (Sandbox Code Playgroud)

如果需要,您还可以通过索引获取容器

itemsControl.ItemContainerGenerator.ContainerFromIndex(0);
Run Code Online (Sandbox Code Playgroud)


And*_*rke 5

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

我修改了代码以返回给定类型的所有子项的列表,因为它是我需要的并且认为其他人可能会发现它有用.

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

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;
    }
Run Code Online (Sandbox Code Playgroud)