2012-01-17 4 views
0

В моей MainWindow, у меня есть ListBox чей ItemsSource привязан к ObservableCollection из Layout POCO объектов:Родитель-Ребенок внутри DataTemplate

<ListBox x:Name="ListBox" ItemsSource="{Binding Layouts}"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel IsItemsHost="True" Orientation="Horizontal" /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 

Кроме того, в MainWindow, мы определяем визуальное представление Макет объекта с использованием UserControl (LayoutUserControl):

<DataTemplate DataType="{x:Type local:Layout}"> 
    <local:LayoutUserControl /> 
</DataTemplate> 

При добавлении объектов в коллекции макетов, мы видим новые LayoutUserControls заполнения ListBox. Это довольно прямолинейно.

Теперь, что бы я хотел сделать, как-то обменивается данными с MainWindow на отдельные LayoutUserControls. В частности, из MainWindow я хочу вызвать один метод для каждого из LayoutUserControls ... Если я попытаюсь выполнить итерацию в коллекции Items ListBox, все, что я получаю, это ссылка на объекты Layout, а не LayoutUserControls. Поскольку LayoutUserControls определены в DataTemplate, у меня нет именованной ссылки для доступа к ним ...

Есть ли конструкция WPF, поддерживающая этот тип взаимодействия от родительского элемента к дочерним элементам управления? Первоначальная мысль RoutedEvents была моей, но они поддерживают только связь с родителями (пузырьками). Может быть, командование - это путь?

Любая помощь будет оценена по достоинству.

Спасибо!

ответ

2

Да, есть способ , который вы никогда не должны использовать, это ItemContainerGenerator.

Вы должны, как вы сами отметили, настроить общение по-разному, команды звучат разумно. Выведите команду на Layout и привяжите к ней UserControl. Или создайте событие и подпишитесь на него UserControl, затем вы можете его поднять.

+0

Спасибо за оперативную обратную связь. Я хотел бы держаться подальше от регистрации «старой школы», если это возможно. Я довольно уверен, что могу предоставить простой ICommand в LayoutUserControl. Как я могу привязать его и вызвать его из MainWindow? Любые ссылки или примеры, которыми вы можете поделиться? –

+0

@JohnRussell: Ну, команды обычно относятся к данным, и то, что вы хотите, это данные для ui, поэтому использование старого школьного мероприятия было бы намного проще, на мой взгляд. Использование команд наверняка может работать так или иначе, но я не могу дать хороший метод сразу с места в карьер, но я тоже буду изучать его ... –

+0

Ah. Теперь, я думаю, я вижу, куда вы идете ... Исправьте меня, если я ошибаюсь. Я могу добавить метод к объекту Layout, назовите его OnRaiseEvent(). Он будет вызываться из моего MainWindow для каждого из макетов в коллекции. Внутри объекта Layout OnRaiseEvent поднимет событие для LayoutUserControl для выполнения моей задачи. Это то, что вы говорите? –

0

В Silverlight есть расширение, называемое GetItemsAndContainers, как описано в this SO question, которое делает это, но я не могу найти эквивалент в WPF.

Однако это может быть возможно, как описано в How can I access the ListViewItems of a WPF ListView?, с помощью VisualTreeHelper для получения LayoutUserControls внутри ListBox.

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