2010-10-23 60 views
4

假設我有不同類別的對象的集合。每個類都有一個資源文件中的UserControl DataTemplated。在ItemsControl中的每個項目周圍包裹東西

現在我想使用ItemsControl來顯示集合,但我想要一個邊框或擴展器圍繞每個項目。

我希望是這樣工作的:

<ItemsControl ItemsSource="{Binding MyObjects}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Border BorderBrush="Black" BorderThickness="3"> 
       <ContentPresenter/> 
      </Border> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

但ContentPresenter似乎挑選的ItemTemplate,因爲我得到一個堆棧溢出。

如何獲取ItemTemplate中的每個Item的DataTemplate?

+0

我認爲你需要提供您所遇到的錯誤一些細節。你的輸出窗口是否提供任何線索? – benPearce 2010-10-23 11:50:43

+0

我有一個按鈕,將項目添加到MyObjects。點擊它後,輸出中沒有新的東西。我從WindowsBase.dll中得到System.StackOverflowException。沒有可用的源代碼,沒有反彙編來顯示我,但沒有例外本身的細節。 (「由於當前線程處於堆棧溢出狀態,因此無法評估表達式」)。 VS中的調用堆棧不會給我任何東西。但是如果我從ItemTemplate中刪除ContentPresenter,那麼對於每個項目我只會得到一個空的邊框,並且沒有堆棧溢出。 – Guge 2010-10-23 12:38:14

回答

8

通常情況下,您可能會考慮通過對項目容器進行模板來完成此操作。問題是「generic」ItemsControl使用ContentPresenter作爲其項目容器。因此,即使您嘗試使用ItemContainerStyle設置樣式,您也會發現無法提供模板,因爲ContentPresenter不支持控件模板(它確實支持數據模板,但在這裏沒有用處)。

要使用可模板化的容器,您必須從ItemsControl(如example)中進行驅動。可以替代使用ListBox控件。然後,您可以通過樣式設置ListBoxItem模板來提供自定義模板。

你可以閱讀更多有關集裝箱here

(與您permissen我加入解決您的答案,古格)

<ListBox ItemsSource="{Binding MyObjects}" Grid.Column="1"> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal"/> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
          <Border BorderBrush="Black" BorderThickness="3"> 
           <ContentPresenter/> 
          </Border> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ListBox.ItemContainerStyle> 
    </ListBox> 
+0

非常感謝。我有時會忽視模板可以成爲風格的一部分。有些東西是違反直覺的,希望只在我自己的顱腔內。 – Guge 2010-10-23 13:13:48

+0

這是違反直覺的,至少與其他技術相比!記住Style可以設置任何屬性,而Template本身只是另一個屬性(這是WPF的「魔術」)。 – Schneider 2010-10-23 13:22:36