2012-01-17 71 views
0

在我的主窗口,我有一個ListBoxItemsSource勢必LayoutObservableCollection POCO對象:親子裏面的DataTemplate

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

此外,在主窗口中,我們定義的可視化表示使用UserControl(LayoutUserControl)佈局對象:

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

當我們將對象添加到佈局集合,我們看到新的LayoutUserControls填充ListBox。這非常簡單。

現在,我想要做的是以某種方式從MainWindow與各個LayoutUserControls進行通信。具體來說,從MainWindow中,我想調用每個LayoutUserControls上的單個方法...如果我試圖遍歷ListBox的Items集合,我所得到的只是對Layout對象的引用,而不是對LayoutUserControls的引用。由於LayoutUserControls是在一個DataTemplate中定義的,我沒有一個命名引用來訪問它們...

是否有一個WPF構造支持從父到子控件這種類型的交互? RoutedEvents是我的第一個想法,但他們只支持孩子與父母(泡泡)的交流。也許命令是要走的路?

任何幫助,將不勝感激。

謝謝!

回答

2

是的,有一種方法,你不應該使用,這是ItemContainerGenerator

正如你自己所指出的那樣,你應該設置不同的通信方式,命令的聲音是合理的。在Layout上公開命令並將UserControl綁定到它。或者創建一個活動並使UserControl訂閱它,然後您可以提出。

+0

感謝您的及時反饋。如果可能,我想遠離「舊學校」活動註冊。我相當有信心,我可以在LayoutUserControl中公開一個簡單的ICommand。我如何綁定到它並從MainWindow中調用它?任何可以分享的參考資料或例子? – 2012-01-17 16:49:26

+0

@JohnRussell:那麼,命令通常是ui數據,而你想要的數據就是ui數據,所以在我看來,使用舊學校活動會更容易。使用命令肯定可以起作用,但我不能給出一個很好的方法,但我也會考慮它... – 2012-01-17 16:54:35

+0

啊。現在,我想我知道你要去哪裏了...如果我錯了,請糾正我。我可以向Layout對象添加一個方法,將其稱爲OnRaiseEvent()。它將從我的MainWindow中調用集合中的每個佈局。在Layout對象內部,OnRaiseEvent會向LayoutUserControl引發一個事件來執行我的任務。那是你在說什麼? – 2012-01-17 17:02:47