2010-05-01 80 views
7

我正在構建一個派生自TabControl的自定義WPF控件。在ControlTemplate中,我使用ItemsControl來顯示從模板(FileMenuItem類型的可觀察集合)綁定的列表。程序執行過程中,我發現了以下錯誤在輸出窗口:WPF自定義控件 - ItemsControl模板未應用

的ItemTemplate和ItemTemplateSelector 的項目已經 的ItemsControl的容器類型的被忽略; Type ='FileMenuItem'

FileMenuItem類型從MenuItem派生。如果我將基類更改爲DependencyObject,則代碼實際運行並應用模板(這是一個選項)。我GOOGLE了錯誤,找不到任何關於它的信息,有沒有人在開發自定義控件時遇到這個問題?即使我有一個解決方法,我想知道發生了什麼,我認爲使用MenuItem作爲基類是一個更清潔的實現。

我可以發佈更多的代碼,如果它會幫助。謝謝!

回答

6

DataTemplate(如ItemTemplate)的用途是爲數據對象提供可視化。具體而言,它定義了一組要添加到可視化樹中的元素,而不是提供給ContentPresenter或ItemsPresenter的數據。在你的情況下,你的源列表是一個對象的集合,它們已經能夠被直接添加到可視化樹中以在UI中顯示。

您可以在下面的簡單示例中看到這一點,其中只有「三」顯示爲紅色,因爲前兩項是以ComboBox可以直接顯示的形式定義的。

<ComboBox> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding}" Foreground="Red"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
    <ComboBoxItem>One</ComboBoxItem> 
    <ComboBoxItem>Two</ComboBoxItem> 
    <sys:String>Three</sys:String> 
</ComboBox> 
+1

好吧,我想我明白 - 是這樣,有可能支持此方案,或者我需要切換到從一個不同的基類繼承?謝謝你的幫助! – 2010-05-03 20:19:34

+5

有很多不同的方法可以去。您應該嘗試確定是否要將集合項目視爲控件(派生自UIElement)或數據(INotifyPropertyChanged或DependencyObject),或者同時創建數據類和UI控件或DataTemplate。另一種可能的選擇是覆蓋GetContainerForItemOverride和IsItemItsOwnContainerOverride的派生ItemsControl,以便爲每個項目(ComboBox,ListBox等)使用FileMenuItem容器。 – 2010-05-04 02:50:50

+5

爲我解決這個問題的最簡單(和有效的)方法之一一直是派生自己的ItemsControl,並重寫'IsItemItsOwnContainerOverride'方法返回false,這意味着DataTemplate不會因爲問題John而跳過解釋。 – GEEF 2014-10-08 15:37:21