0

在我的 MainWindow 中,我有一个绑定到POCO 对象ListBox的who:ItemsSourceObservableCollectionLayout

<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 是我的第一个想法,但它们只支持子到父(气泡)通信。也许命令是要走的路?

任何帮助,将不胜感激。

谢谢!

4

2 回答 2

2

是的,有一种你永远不应该使用的方法,它是ItemContainerGenerator.

正如您自己指出的那样,您应该以不同的方式设置通信,命令听起来很合理。在 上公开一个命令Layout并将其绑定UserControl到它。或者创建一个事件并UserControl订阅它,然后你可以提出它。

于 2012-01-17T16:31:24.773 回答
0

在 Silverlight 中有一个名为 GetItemsAndContainers 的扩展,如此 SO question中所述,它可以执行此操作,但我在 WPF 中找不到等效项。

但是,如如何访问 WPF ListView 的 ListViewItems 中所述,它仍然是可能的。通过使用 VisualTreeHelper 获取 ListBox 内的 LayoutUserControls。

于 2012-01-17T17:22:31.477 回答