DataTemplate中的父子项

本文关键字:父子 DataTemplate | 更新日期: 2023-09-27 18:20:46

在我的主窗口中,我有一个ListBox,它的ItemsSource绑定到Layout POCO对象的ObservableCollection

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

此外,在MainWindow中,我们使用UserControl(LayoutUserControl):定义Layout对象的视觉表示

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

当我们将对象添加到Layouts集合时,我们会看到新的LayoutUserControls填充ListBox。这是非常直接的。

现在,我想做的是以某种方式从MainWindow到各个LayoutUserControls进行通信。具体来说,在MainWindow中,我想在每个LayoutUserControls上调用一个方法。。。如果我尝试遍历ListBox的Items集合,我得到的只是对Layout对象的引用,而不是LayoutUserControls。由于LayoutUserControls是在DataTemplate中定义的,所以我没有访问它们的命名引用。。。

是否有一个WPF构造支持从父控件到子控件的这种类型的交互?RoutedEvents是我的第一个想法,但它们只支持孩子对父母(bubble)的通信。也许命令是前进的道路?

如有任何帮助,我们将不胜感激。

谢谢!

DataTemplate中的父子项

是的,有一个方法永远不应该使用,它就是ItemContainerGenerator

正如你自己所指出的,你应该以不同的方式建立沟通,命令听起来很合理。在Layout上公开一个命令并将UserControl绑定到它。或者创建一个事件并使UserControl订阅它,然后就可以引发它。

在Silverlight中,有一个名为GetItemsAndContainers的扩展,正如这个SO问题中所描述的那样,它可以做到这一点,但我在WPF中找不到等效的扩展。

但是,如"如何访问WPF ListView的ListViewItems?通过使用VisualTreeHelper获取ListBox内部的LayoutUserControls。