在我的MainWindow中,我有一个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中,我们使用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是我的第一个想法,但它们只支持子到父(泡沫)通信。也许命令是要走的路?
任何帮助都将不胜感激。
谢谢!
答案 0 :(得分:2)
是的,有一个方法,你永远不应该使用,它是ItemContainerGenerator
。
正如您所说,您应该以不同方式设置通信,命令听起来合理。在Layout
上公开命令并将UserControl
绑定到它。或者创建一个事件并让UserControl
订阅它,然后你可以提高它。
答案 1 :(得分:0)
在Silverlight中有一个名为GetItemsAndContainers的扩展,如this SO question中所述,但是我在WPF中找不到相应的内容。
然而,如How can I access the ListViewItems of a WPF ListView?中所述,通过使用VisualTreeHelper获取ListBox中的LayoutUserControls,仍然可以实现。