2010-04-05 4 views
2

У меня есть ItemControl, связанный с набором объектов. Каждый объект имеет свою собственную коллекцию, а также другие важные свойства. Чтобы отображать объекты внутри объекта, я показываю TreeView внутри элемента ItemsControl. Я знаю, это звучит безумно. Но это всего лишь урезанная версия того, что я пытаюсь сделать, чтобы уделить внимание проблеме. Вот мой пример:Silverlight 3 - Найти элемент внутри элемента управления

<ItemsControl x:Name="myItemsControl"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <controls:TreeView x:Name="myTreeView"> 
     </controls:TreeView> 
    </DataTemplate>          
    </ItemsControl.ItemTemplate>           
</ItemsControl> 

Когда пользователь нажимает на кнопку, мне нужно, чтобы получить текущую TreeView, связанную с конкретным объектом. В попытке сделать это, я пытаюсь следующее:

MyClass instanceToFind = (MyClass)(IdentifyDesiredInstance());     
foreach (MyClass instance in myItemsControl.Items) 
{ 
    if (instance.ID == instanceToFind.ID) 
    { 
    TreeView treeView = null; // How do I get the TreeView? 

    // Do other necessary updates 
    } 
} 

Выше фрагмент кода показывает, где я пытаюсь получить TreeView. Как я могу получить TreeView при циклическом перемещении элементов в itemcontrol?

Спасибо!

ответ

3

Вам необходимо использовать методы VisualTreeHelper.GetChild и VisualTreeHelper.GetChildrenCount, чтобы перебирать дочерние объекты, пока не найдете дерево, соответствующее вашему изделию. Вы должны иметь возможность проверить свойство TreeView.DataContext против вашего товара, чтобы убедиться в его правильности. Обратите внимание: вам нужно использовать это рекурсивно, так как GetChild извлекает только непосредственных детей.

Как и следовало бы, для продолжения итерации визуального дерева я рекомендую отказаться от вашего текущего цикла и вместо этого просто зациклить детей, проверив идентификатор контекстов данных.

Смежные вопросы