【问题标题】:WPF Custom Control - ItemsControl template not being appliedWPF 自定义控件 - 未应用 ItemsControl 模板
【发布时间】:2010-05-01 06:00:04
【问题描述】:

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

ItemTemplate 和 ItemTemplateSelector 已被忽略的项目 ItemsControl 的容器类型; 类型='FileMenuItem'

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

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

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    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>
    

    【讨论】:

    • 好的,我想我明白了——那么,是否可以支持这种情况,或者我是否需要切换到从不同的基类继承?感谢您的帮助!
    • 您可以采用多种不同的方式。您应该尝试决定是否要将集合项视为控件(从 UIElement 派生)或数据(INotifyPropertyChanged 或 DependencyObject),或者同时创建数据类和 UI 控件或 DataTemplate。另一个可能的选项是派生的 ItemsControl,它覆盖 GetContainerForItemOverride 和 IsItemItsOwnContainerOverride,为每个项目使用 FileMenuItem 容器(ComboBox、ListBox 等这样做)。
    • 对我来说解决这个问题的最简单(和有效)的方法之一一直是派生自己的 ItemsControl,并重写 IsItemItsOwnContainerOverride 方法以返回 false,这意味着 DataTemplate 不会由于约翰解释的问题而被跳过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多