Родитель-ребенок внутри DataTemplate - PullRequest
0 голосов
/ 17 января 2012

В моем главном окне у меня есть ListBox, ItemsSource которого связан с ObservableCollection из Layout объектов POCO:

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

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

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

Когда мы добавляем объекты в коллекцию Layouts, мы видим, что новые LayoutUserControls заполняют ListBox. Это довольно просто.

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

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

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 17 января 2012

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

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

0 голосов
/ 17 января 2012

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

Однако это все еще возможно, как описано в Как я могу получить доступ к ListViewItems WPF ListView? с помощью VisualTreeHelper для получения LayoutUserControls внутри ListBox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...