我如何制作一个显示任意内容作为项目模板一部分的ComboBox?

时间:2009-06-18 18:42:06

标签: wpf combobox

我需要创建几个组合框来表示枚举值。我希望通过左侧的一些图形预览和右侧的文本来表示值。显示器的“预览”部分可以是控件,图像或一些其他内容。我已经尝试了两种方法并且都失败了,所以我很好奇一些替代品可能是什么。在我的测试中,“预览”是一个按钮,因为它很方便创建,但实际上它将是自定义控件或DrawingImage控件。

对于第一种方法,我决定使用ContentPresenter为我显示预览内容。为此,我使用适当的属性和模板创建了一个控件。我创建了一个集合类型,用这个控件的实例填充自己,然后在我的窗口的资源中放置集合的实例。我将ComboBox的 ItemSource 属性绑定到此集合。当有一个ComboBox时它很好用,但是当有多个ComboBox使用该资源时,其中一个ComboBox没有显示任何值。我认为这可能与控件是其内容的事实有关,并且某种重新定位的问题正在发生。

我认为这是接近它的错误方法,并尝试使用ComboBox的ItemTemplate来完成我的脏工作。我重新设计了数据类以继承DependencyObject而不是Control,并使用控件的旧样式作为数据类型的数据模板。如果多个ComboBox绑定到同一个资源实例,这仍然有问题;第一个ComboBox正确显示预览内容,但是一旦你下拉第二个ComboBox,预览内容就会从两个ComboBox中消失。在这种方法中,所选项目也不会显示在ComboBox中,尽管我可能已经错过了我需要为此设置的其他模板。如果我将DataTemplate直接设置为ComboBox的ItemTemplate,则所选项目会正确显示,但会破坏弹出窗口中的控件。我绝对不会在这里做事。

如果我在我的资源中创建了两个集合实例,那么第二种方法是有效的,但这并不实际。我可以重构我的应用程序以在代码中设置对集合的私有实例的绑定,但这似乎有点讨厌。我可以为每种类型的集合派生一个新的ComboBox,让它自动使用集合的新实例,但这似乎太多了。看起来我想要的东西不会太常见,但我似乎找不到有用的东西。我究竟做错了什么?

1 个答案:

答案 0 :(得分:2)

您不应将FrameworkElement派生对象用作ItemControls中的内容,因为它们只能显示一次。

而是使用DataTemplates控制项目在ComboBox中的显示方式。在非常复杂的情况下,您可以使用DataTemplate选择器。 Bea Stollnitz有一篇关于这个here的优秀文章。