我正在构建一个源自TabControl的自定义WPF控件。在ControlTemplate中,我使用ItemsControl来显示从模板绑定的列表(FileMenuItem类型的可观察集合)。在程序执行期间,我在输出窗口中收到以下错误:
ItemTemplate和ItemTemplateSelector 已被忽略的项目被忽略 ItemsControl的容器类型; 类型= 'FileMenuItem'
FileMenuItem类型派生自MenuItem。如果我将基类更改为DependencyObject,则实际运行代码并应用模板(这是一个选项)。我搜索了错误,无法找到任何关于它的信息,是否有人在开发自定义控件时遇到此问题?即使我有一个解决方法,我想了解发生了什么,我认为使用MenuItem作为基类是一个更清洁的实现。
如果有帮助,我可以发布更多代码。谢谢!
答案 0 :(得分:7)
DataTemplate(如ItemTemplate)的目的是为数据对象提供可视化。具体来说,它定义了一组要添加到可视树中的元素,而不是提供给ContentPresenter或ItemsPresenter的数据。在您的情况下,您的源列表是一组对象,这些对象已经能够直接添加到可视化树中以便在UI中显示。
您可以在下面的简化示例中看到这一点,其中只有“Three”显示为Red,因为前两个项目是以可以由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>