У меня есть ItemsControl определен нижеContentPresenter не может найти контроль
<ItemsControl Name="PlannerItemControl">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Name="MainGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<TextBox Name="test" ></TextBox>
...
...
...
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
В моем коде позади, я хочу, чтобы перебрать все элементы управления в элементе
PlannerItemControl.ItemsSource = Plannermod.TimetableModelList;
foreach (var item in PlannerItemControl.Items)
{
ContentPresenter cp = PlannerItemControl.ItemContainerGenerator.ContainerFromItem(item) as ContentPresenter;
TextBox tb = FindVisualChild<TextBox>(cp);
if (tb != null)
{
// do something with the textbox
}
}
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;
}
Проблема заключается в Значение cp всегда равно null, хотя в элементе items есть элементы, так как я попадаю в цикл foreach. Пожалуйста, помогите
Это может быть полезно: http://stackoverflow.com/questions/16184172/itemcontainergenerator -containerfromitem-returns-null-while-virtualizingstackp, http://stackoverflow.com/questions/6713365/itemcontainergenerator-containerfromitem-returns-null. – goobering
Возможно, вы ошибаетесь. Вместо того, чтобы кастинг в ContentPresenter, откройте в FrameworkElement :) или начните поиск прямо из ItemsControl. Нет необходимости в контейнере. Измените FindVisualChild, чтобы искать и сопоставлять DataContext с элементом –
@dev hedgehog проблема возникает перед FindVisualChild. cp имеет значение null. Я попытался изменить бросок на FrameworkElement, но это не помогает. Также попытался передать элемент непосредственно в FindVisualChild (с приложением в качестве зависимого объекта), но это не работает – user2837961