在WPF中如何将组合框绑定到TabControl项?

时间:2013-05-15 18:06:21

标签: c# wpf windows visual-studio-2010 c#-4.0

我正在学习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对象?我觉得我错过了一些明显的东西

顺便说一下,我知道我说我想用这个来控制导航,但是我把所有这些都搞砸了,在我弄清楚这个令人发狂的事情之后我会担心它。

Showing proper items in combobox

仔细观察 - 当我从组合框中选择tabItem1时,它实际上重新渲染了控件内的标签项。您可以看到它的顶部,由列表项使用的标准蓝色选择背景包围。郁闷了。

tabItem painting in combobox

我在这里做错了什么?谢谢你的帮助

1 个答案:

答案 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。