我正在学习WPF,我有一个关于绑定ComboBox的问题
我有一个简单的WPF窗口,其中包含以下控件:顶部的ComboBox和它下面的TabControl。
我使用两个标准TabItem填充tabcontrol。然后我添加了一些标签 - 但是这些是我自己的“MyTab”类,只是继承了TabItem。我没有压倒任何东西或做任何异国情调,我只是添加了一些公共财产。
我想将ComboBox用作导航工具。每个选项卡都有一个标题,同一个标题应该成为ComboBox中的一个项目。如果从ComboBox中选择,它应该使相应的选项卡成为活动选项卡。
以下是我在ComboBox上的设置:
<Window.Resources>
<DataTemplate x:Key="EmployeeListTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Header}" />
</StackPanel>
</DataTemplate>
</Window.Resources>
..然后在Xaml进一步向下......
<ComboBox Grid.Row="1" Width="500" Name="qlist"
ItemsSource="{Binding ElementName=tabControl1, Path=Items}"
ItemTemplate="{StaticResource EmployeeListTemplate}" />
所以我只是绑定到TabControl的Item集合并选择Header作为SelectedItem的属性来显示。
它有效,当我单击ComboBox时,标题确实显示为单独的文本项。但是当我进行实际选择时,该标签本身会在该组合框的选择区域中呈现!
我该如何解决这个问题?为什么它使用列表的Header属性,但是当我从列表中选择时,它显示的值变为实际的TabItem对象?我觉得我错过了一些明显的东西
顺便说一下,我知道我说我想用这个来控制导航,但是我把所有这些都搞砸了,在我弄清楚这个令人发狂的事情之后我会担心它。
仔细观察 - 当我从组合框中选择tabItem1时,它实际上重新渲染了控件内的标签项。您可以看到它的顶部,由列表项使用的标准蓝色选择背景包围。郁闷了。
我在这里做错了什么?谢谢你的帮助
答案 0 :(得分:1)
这是WPF的工作方式。如果可以在没有DataTemplates的情况下渲染所选项目,那么它将完成。由于Items集合是VISUAL元素的集合,因此DataTemplate不会用于呈现“selected”元素。
这里注意:所选项目使用ContentPresenter,而下拉列表使用另一个名为ItemsPresenter的东西,它总是使用DataTemplate渲染,即使底层绑定对象可以没有渲染。
您需要将ComboBox&amp; TabControl ItemsSource与您自己的自定义列表绑定。这样你最终会得到你想要的东西。或者,您可以覆盖ComboBox完整的可视化树(http://msdn.microsoft.com/en-us/library/dd334408%28v=vs.95%29.aspx) - 请参阅ContentPresenter部分。将其替换为您的datatemplate。