Tôi có một TabControl
trên UserControl
được hỗ trợ bởi ViewModel và Visibility
của một trong các mục tab được gắn với thuộc tính trên ViewModel.WPF TabControl - Chọn tab khác khi TabItem Hiển thị thay đổi
<TabControl x:Name="myTabControl">
<TabItem Header="Tab 1" />
<TabItem Header="Tab 2" Visibility="{Binding HasData, Converter={StaticResource boolToVisibilityConverter}}"/>
</TabControl>
Khi Visibility
của TabItem
thay đổi, nó sụp đổ (da) các TabItem
tiêu đề, nhưng nó vẫn tiếp tục hiển thị nội dung của nó.
Tôi muốn TabControl
sang chuyển sang tab hiển thị khi tab khác bị ẩn và hơi ngạc nhiên khi biết rằng điều đó không xảy ra tự động.
Gắn một event handler cho sự kiện SelectionChanged
của TabControl
cho thấy TabItem.IsSelected
(và TabControl.SelectedItem
) thậm chí còn không bị ảnh hưởng khi TabItem.Visibility
thay đổi (điều này là một lỗi ?!).
Tôi đã thử cả hai kích hoạt tài sản:
<!-- 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>
và dữ liệu kích hoạt:
<!-- 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>
tôi có thể không nhận được những nguyên nhân để làm việc, và không có VisibilityChanged
sự kiện tôi có thể xử lý, vì vậy tôi bị mắc kẹt và sẽ đánh giá cao một số trợ giúp.
Ah, điều đó sẽ làm! (+1) Không biết tại sao tôi không phát hiện ra nó sớm hơn - tôi đoán MSDN phải lọc ra các thuộc tính kế thừa vào thời điểm đó. Tôi sẽ ngừng đánh dấu đây là câu trả lời chỉ để xem liệu có ai đó có đề xuất không viết mã, nhưng cảm ơn bạn rất nhiều. – Riko