有没有办法在ListBox项目模板重复?
-
22-08-2019 - |
题
我有一个包含由一个单一的文本框表示的项目的列表框。
当用户点击一个按钮,我想重复直通所有这些文本框和检查,如果他们的绑定表达式是干净的错误; 应该是这样的:
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
任何讨论将非常感激。 感谢。
解决方案
有可能做到这一点更简单的方法,但这里是一个选择,将工作:
1)至项的列表迭代。
由于使用的是项目源,ListBox.Items
将指在的ItemsSource的数据项。
for (int i = 0; i < ListBox.Items.Count; i++)
{
// do work as follows below...
}
2)获取容器这些项目。
DependencyObject obj = ListBox.ItemContainerGenerator.ContainerFromIndex(i);
3)使用VisualTreeHelper要搜索的容器中的可视的文本框的孩子。
TextBox box = FindVisualChild<TextBox>(obj);
使用该功能来搜索正确类型的可视子:
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;
}
4)最后,检查对文本框的结合。
全部放在一起,是这样的:
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;
}
其他提示
到VB之前的帖子的翻译:
1)
For i As Integer = 0 To ListBox.Items.Count - 1
' do work as follows below...
Next
2)
Dim obj As DependencyObject = ListBox.ItemContainerGenerator.ContainerFromIndex(i)
3)
Dim box As TextBox = FindVisualChild(Of TextBox)(obj)
'************************
Public Shared Function FindVisualChild(Of ChildItem As DependencyObject)(ByVal obj As DependencyObject) As ChildItem
' Search immediate children
For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(obj) - 1
Dim child As DependencyObject = VisualTreeHelper.GetChild(obj, i)
If TypeOf child Is ChildItem Then
Return child
Else
Dim childOfChild As ChildItem = FindVisualChild(Of ChildItem)(child)
If childOfChild IsNot Nothing Then Return childOfChild
End If
Next
Return Nothing
End Function
4)
Private Function ValidateList(ByVal lb As ListBox) As Boolean
For i As Integer = 0 To lb.Items.Count - 1
Dim obj As DependencyObject = lb.ItemContainerGenerator.ContainerFromIndex(i)
Dim box As TextBox = FindVisualChild(Of TextBox)(obj)
If Not TestBinding(box) Then
Return False
End If
Next
Return True
端功能
不隶属于 StackOverflow