2009-10-12 37 views
0

的孩子,我有一個DataTemplate,看起來像這樣一個列表框中:訪問一個ListBoxItem

<ListBox Name="listBox"> 
     <ListBox.ItemTemplate> 
      <DataTemplate DataType="x:Type local:NumericIconDefinition"> 
       <Grid> 
        <ComboBox Name="IconComboBox"/> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

我想在後面的代碼獲取ComboBox實例in order to manipulate it。我發現了一個博客貼子,說明獲取的ListBoxItem的過程:

ListBoxItem lbi = (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromIndex(IndexInListBox); 

但我不能找到訪問該項目的網格,然後組合框實例的好方法。理想的情況下,建在上面的代碼,我願做這樣的事情:

ComboBox cb = (ComboBox)lbi.GetChildByName("IconComboBox"); 

回答

1

您可以訪問它,雖然模板的FindName方法:

ComboBox cb = (ComboBox)listBox.ItemTemplate.FindName("IconComboBox", lbi); 

請注意,你只能這樣做在ListBoxItem完全加載後,否則該模板將不會被實例化。

+0

我收到錯誤「此操作僅對應用此模板的元素有效。」,lbi.IsInitialized和lbi.isLoaded都報告爲true。是否由您警告過我的模板實例化問題導致的錯誤消息?我怎樣才能確保它的加載? – Mizipzor 2009-10-15 07:48:00

+0

好的,實際上它不是您必須傳遞給FindName方法的ListBoxItem,而是展示數據的ContentPresenter。你可以在FindName方法的MSDN頁面找到一個例子:http://msdn.microsoft.com/en-us/library/system.windows.frameworktemplate.findname.aspx – 2009-10-15 16:49:32

+1

是的,我發現,當谷歌搜索一些更多信息在下午。我計劃明天在這裏發佈一個短代碼片段。至少要將問題作爲個人參考。 – Mizipzor 2009-10-15 21:12:29