【发布时间】:2011-04-04 06:26:57
【问题描述】:
我在由 ViewModel 支持的 UserControl 上有一个 TabControl,其中一个选项卡项的 Visibility 绑定到 ViewModel 上的一个属性。
<TabControl x:Name="myTabControl">
<TabItem Header="Tab 1" />
<TabItem Header="Tab 2" Visibility="{Binding HasData, Converter={StaticResource boolToVisibilityConverter}}"/>
</TabControl>
当TabItem 的Visibility 发生变化时,它会折叠(隐藏)TabItem 标头,但会继续显示其内容。
我希望TabControl 在另一个标签被隐藏时切换到可见标签,我有点惊讶地发现它不会自动发生。
将事件处理程序附加到TabControl 的SelectionChanged 事件表明TabItem.IsSelected(和TabControl.SelectedItem)甚至不会在TabItem.Visibility 更改时受到影响(这是一个错误吗?!)。
我已经尝试了两个属性触发器:
<!-- This doesn't compile because of TargetName on the Setter, think you can only use it in Control Templates.
I don't know how to refer to the parent TabControl from within the TabItem style. -->
<TabControl.ItemContainerStyle>
<Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}">
<Style.Triggers>
<Trigger Property="Visibility" Value="Collapsed">
<Setter TargetName="myTabControl" Property="SelectedIndex" Value="0" />
</Trigger>
</Style.Triggers>
</Style>
</TabControl.ItemContainerStyle>
和一个数据触发器:
<!-- This doesn't quite work, it affects the Visibility of the TabItem's content too -->
<TabControl.Style>
<Style TargetType="{x:Type TabControl}" BasedOn="{StaticResource {x:Type TabControl}}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=SelectedItem.Visibility, ElementName=tabControl}"
Value="Collapsed">
<Setter Property="SelectedIndex" Value="0" />
</DataTrigger>
</Style.Triggers>
</Style>
</TabControl.Style>
我无法让触发器工作,也没有我可以处理的 VisibilityChanged 事件,所以我有点卡住了,希望能得到一些帮助。
【问题讨论】:
标签: wpf