2010-05-01 81 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