C# WPF自定义控件-未应用ItemsControl模板

C# WPF自定义控件-未应用ItemsControl模板,c#,wpf,C#,Wpf,我正在构建一个从TabControl派生的自定义WPF控件。在ControlTemplate中,我使用ItemsControl显示从模板绑定的列表(FileMenuItem类型的可观察集合)。在程序执行期间,我在输出窗口中遇到以下错误: ItemTemplate和ItemTemplateSelector 对于已存在的项忽略 ItemsControl的容器类型; Type='FileMenuItem' FileMenuItem类型派生自MenuItem。如果我将基类更改为DependencyObj

我正在构建一个从TabControl派生的自定义WPF控件。在ControlTemplate中,我使用ItemsControl显示从模板绑定的列表(FileMenuItem类型的可观察集合)。在程序执行期间,我在输出窗口中遇到以下错误:

ItemTemplate和ItemTemplateSelector 对于已存在的项忽略 ItemsControl的容器类型; Type='FileMenuItem'

FileMenuItem类型派生自MenuItem。如果我将基类更改为DependencyObject,那么代码将实际运行并应用模板(这是一个选项)。我在谷歌上搜索了这个错误,找不到任何关于它的信息,有人在开发自定义控件时遇到过这个问题吗?尽管我有一个解决方法,但我想了解发生了什么,并且我认为使用MenuItem作为基类是一个更干净的实现


如果有帮助的话,我可以发布更多的代码。谢谢

数据模板(如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>

一个
两个
三

好的,我想我明白了-那么,是否有可能支持这种情况,或者我需要切换到从其他基类继承?谢谢你的帮助!你可以走很多不同的路。您应该尝试决定是将集合项视为控件(从UIElement派生)还是数据(INotifyPropertyChanged或DependencyObject),还是同时创建数据类和UI控件或数据模板。另一个可能的选项是派生ItemsControl,它覆盖GetContainerForItemOverride和IsItemItsOwnContainerOverride,以便为每个项使用FileMenuItem容器(ComboBox、ListBox等)。对我来说,解决此问题最简单(也是最有效)的方法之一始终是派生您自己的ItemsControl,并重写
IsItemItsOwnContainerOverride
方法以返回false,这意味着不会由于John解释的问题跳过DataTemplate。