【问题标题】:In WPF how do I bind a combobox to TabControl Items?在 WPF 中,如何将组合框绑定到 TabControl 项?
【发布时间】:2013-05-15 18:06:21
【问题描述】:

我正在学习 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 的属性来显示。

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

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

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

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

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

【问题讨论】:

  • 这是 WPF 中的一个实际错误。有解决办法,贴在这里:stackoverflow.com/questions/546119/…
  • 这非常有帮助!谢谢!与此同时,我用一个列表框重新做了这个,它工作得很好。包括双向绑定,因此我可以从选项卡控件或列表中选择活动选项卡。那让我发疯了。谢谢你给我另一个参考

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


【解决方案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 部分。将其替换为您的数据模板。

【讨论】:

  • 抱歉,我花了这么长时间才将其标记为已回答。我花了一段时间才明白这一切,你是/确实是对的。已经快一年了,我学到了很多,回首往事,这是我学习的关键时刻。我最终只是像你提到的那样创建了一个包装类,并绑定到我自己的返回视觉效果的属性。这给了我想要的结果
猜你喜欢
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 2013-10-04
相关资源
最近更新 更多