例如,我有一个带有自定义DataTemplate的ItemsControl:
<ItemsControl Name="CategoriesList">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
例如,我的集合包含100个元素。我想要检查哪些CheckBoxes,哪些不是,或者我只想更改Content属性。在这两种情况下,我都需要从代码中获取CheckBox元素。所以从代码中获取项目很容易:
var cList = CategoriesList.Items;
foreach (var item in cList)
{
//Do Something
}
但我需要从这些项目中获取CheckBoxes。有可能吗?
谢谢!
答案 0 :(得分:2)
您需要为同一个
使用可视化树助手我用列表框尝试过它,它有效! Ant我认为同样适用于ItemsControl,因为列表框和ItemsControl的属性和方法是相同的。
只需制作并使用此方法挖掘列表框的可视树
public static T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject
{
try
{
int childCount = VisualTreeHelper.GetChildrenCount(parentElement);
if (childCount == 0)
return null;
for (int i = 0; i < childCount; i++)
{
var child = VisualTreeHelper.GetChild(parentElement, i);
if (child != null && child is T)
{
return (T)child;
}
else
{
var result = FindFirstElementInVisualTree<T>(child);
if (result != null)
return result;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return null;
}
这就是你将如何在代码中使用这种方法
ListBoxItem SelectedListBoxItem = this.lstInstagramTags.ItemContainerGenerator.ContainerFromIndex(int index) as ListBoxItem;
if (SelectedListBoxItem == null)
return;
// Iterate whole listbox tree and search for this items
Button btn= FindFirstElementInVisualTree<Button>(SelectedListBoxItem );
btn.Content="Hello";
还有一个Link
希望这有帮助。