0

我正在学习 WPF,我有一个关于绑定 ComboBox 的问题

我有一个简单的 WPF 窗口,其中包含以下控件:顶部的 ComboBox 和下方的 TabControl。

我用两个标准的 TabItems 填充 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 的属性来显示。

它有效,当我单击组合框时,标题确实显示为单个文本项。但是,当我进行实际选择时,该选项卡本身会呈现在该组合框的选择区域中!

我该如何解决?为什么它使用列表的 Header 属性,但是当我从列表中选择时,它显示的值变成了实际的 TabItem 对象?我觉得我错过了一些明显的东西

顺便说一句,我知道我说过我想用它来控制导航,但我把所有这些都去掉了,等我弄清楚这个令人抓狂的事情后我会担心的。

在组合框中显示正确的项目

仔细看 - 当我从组合框中选择 tabItem1 时,它实际上在控件内重新呈现了该选项卡项。您可以看到它的顶部,周围是列表项使用的标准蓝色选择背景。令人抓狂。

组合框中的 tabItem 绘画

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

4

1 回答 1

1

这就是 WPF 的工作方式。如果所选项目可以在没有 DataTemplates 的情况下呈现,那么它将这样做。由于 Items 集合是 VISUAL 元素的集合,因此 DataTemplate 不会用于呈现“选定”元素。

此处注意:所选项目使用 ContentPresenter,而下拉列表使用另一个名为 ItemsPresenter 的东西,它总是使用 DataTemplate 呈现,即使底层绑定对象可以在没有它的情况下呈现。

您需要将您的 ComboBox&TabControl ItemsSource 与您自己的自定义列表绑定。这样你最终会得到你想要的。或者,您可以只覆盖 ComboBox 完整的可视化树(http://msdn.microsoft.com/en-us/library/dd334408%28v=vs.95%29.aspx) - 请参阅 ContentPresenter 部分。将其替换为您的数据模板。

于 2013-05-15T20:24:37.437 回答