DataTemplate中的Parent-Child

时间:2012-01-17 16:27:52

标签: c# wpf xaml user-controls routed-events

在我的MainWindow中,我有一个ListBoxItemsSource绑定了ObservableCollectionLayout个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是我的第一个想法,但它们只支持子到父(泡沫)通信。也许命令是要走的路?

任何帮助都将不胜感激。

谢谢!

2 个答案:

答案 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,仍然可以实现。