You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF如何获取ItemsControl内部动态生成的TextBox文本?

实现错误说明

你的代码有两处核心问题:

  • 对ItemsControl.Items集合的理解完全错误:这个集合存储的是你绑定到控件的业务数据对象,不是运行时渲染出来的TextBox、StackPanel这类UI元素,用OfType<TextBox>()过滤数据集合自然拿不到任何结果。
  • 字符串数组初始化逻辑不成立:string[] phoneNumbers = ""存在类型不匹配的编译错误,且数组为固定长度结构,无法直接调用Append方法追加元素。
最优实现方案(符合WPF设计规范)

你已经在XAML里给TextBox的Text属性做了{Binding TextBoxText}绑定,完全不需要手动遍历查找UI控件,直接遍历数据项取绑定属性值即可,性能更好也不会受可视化树渲染状态影响:

List<string> phoneNumbers = new List<string>();
// 将YourItemType替换为你实际绑定到ItemsControl的项数据类型
foreach (var item in PNItemsControl.Items)
{
    if (item is YourItemType dataItem)
    {
        phoneNumbers.Add(dataItem.TextBoxText);
    }
}
c.PhoneNumbers = phoneNumbers.ToArray();
特殊场景下获取UI子控件的方法

如果有特殊逻辑必须直接获取渲染后的TextBox实例,需要先拿到每个数据项对应的UI容器,再从容器的可视化树中查找目标控件,不要直接遍历Items集合:

  1. 先添加可视化树查找的通用辅助方法:
private T FindVisualChild<T>(DependencyObject parent) where T : DependencyObject
{
    int childCount = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i < childCount; i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(parent, i);
        if (child is T target) return target;
        T nestedResult = FindVisualChild<T>(child);
        if (nestedResult != null) return nestedResult;
    }
    return null;
}
  1. 遍历项容器查找TextBox的逻辑如下:
List<string> phoneNumbers = new List<string>();
foreach (var item in PNItemsControl.Items)
{
    // 获取当前数据项对应的渲染容器
    var itemContainer = PNItemsControl.ItemContainerGenerator.ContainerFromItem(item) as FrameworkElement;
    if (itemContainer == null) continue;
    // 强制应用模板,避免模板未渲染完成导致找不到子控件
    itemContainer.ApplyTemplate();
    TextBox targetTb = FindVisualChild<TextBox>(itemContainer);
    if (targetTb != null)
    {
        phoneNumbers.Add(targetTb.Text);
    }
}
c.PhoneNumbers = phoneNumbers.ToArray();

注意:如果你的ItemsControl自定义了ItemsPanel并开启了UI虚拟化,不在可视区域内的项不会生成对应的UI容器,这种方法无法获取屏幕外项的输入值,非必要不推荐使用这种硬找UI控件的写法。

内容的提问来源于stack exchange,提问作者Kostas Soulios

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 17:27:23