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

标签 c# wpf

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

ItemTemplate and ItemTemplateSelector are ignored for items already of the ItemsControl's container type; Type='FileMenuItem'

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

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

最佳答案

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>

关于c# - WPF 自定义控件 - 未应用 ItemsControl 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2749060/

相关文章:

c# - 允许在 C# 正则表达式模式中使用星号和问号

c# - 远程 Webdriver Chrome 抛出 "path to the driver executable"错误

c# - 如何使用 Exchange Web 服务发送包含 text/plain 和 text/html 的多部分电子邮件?

WPF 入队和重放关键事件

WPF ProgressBar - 绑定(bind)进度值以显示在栏上

c# - 正确的连接字符串语法

c# - 如何在单个原子操作中移动 C# .NET 中的目录

WPF:如何从 DLL 资源文件设置图像源?

c# - ListViewItem 不显示列上的实际文本

wpf - 如何在选中时将焦点设置到 TreeViewItem 中的控件