有没有办法迭代ListBox项模板?

Shi*_*mmy 1 data-binding wpf listbox listboxitem listboxitems

我有一个列表框,其中包含由单个文本框表示的项目.

当用户单击一个按钮时,我想通过所有这些文本框进行迭代,并检查它们的绑定表达式是否没有错误; 应该是这样的:

    Dim errCount = 0
    For Each item In MyListBox.ListBoxItems 'There is no such thing ListBoxItems which is actually what I am looking for.
        Dim tb As TextBox = item '.........Dig in item to extract the textbox from the visual tree.
        errCount += tb.GetBindingExpression(TextBox.TextProperty).HasError
    Next
    If errCount Then
        'Errors found!
    End If
Run Code Online (Sandbox Code Playgroud)

任何讨论都会非常感激.谢谢.

Jos*_*h G 6

可能有一种更简单的方法可以做到这一点,但这里有一个选项可行:

1)遍历项目列表.

因为您正在使用items source,所以ListBox.Items将引用ItemsSource中的数据项.

for (int i = 0; i < ListBox.Items.Count; i++)
{
    // do work as follows below...
}
Run Code Online (Sandbox Code Playgroud)

2)获取这些物品的容器.

DependencyObject obj = ListBox.ItemContainerGenerator.ContainerFromIndex(i);
Run Code Online (Sandbox Code Playgroud)

3)使用VisualTreeHelper搜索容器visual的TextBox子项.

TextBox box = FindVisualChild<TextBox>(obj);
Run Code Online (Sandbox Code Playgroud)

使用此函数可以搜索正确类型的可视子项:

public static childItem FindVisualChild<childItem>(DependencyObject obj)
    where childItem : DependencyObject
{
    // Search immediate children
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);

        if (child is childItem)
            return (childItem)child;

        else
        {
            childItem childOfChild = FindVisualChild<childItem>(child);

            if (childOfChild != null)
                return childOfChild;
        }
    }

    return null;
}
Run Code Online (Sandbox Code Playgroud)

4)最后,检查TextBox上的绑定.

全部放在一起,像这样:

private bool ValidateList(ListBox lb)
{
    for (int i = 0; i < lb.Items.Count; i++)
    {
        DependencyObject obj = lb.ItemContainerGenerator.ContainerFromIndex(i);
        TextBox box = FindVisualChild<TextBox>(obj);
        if (!TestBinding(box))
            return false;
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)