首页 > 解决方案 > 项目源列表为空时如何隐藏选项卡控件

问题描述

我有一个 WPF .NET Core 应用程序,其 TabControl 绑定到 TabItems 的 ObservableCollection。我希望在 ObservableCollection 变空时隐藏 TabControl,并且我想在其位置显示另一个面板。然后,当一个项目被添加回 ObservableCollection 时,我希望隐藏备用面板并重新显示 TabControl。我将如何实现这一点,希望在 XAML 中使用尽可能少的代码隐藏?我知道我可以在代码隐藏中做到这一点。

以下是该应用程序的关键部分。我已经隐藏了 TabControl,并包含了一个边框控件来表示当 TabControl 隐藏时我将显示的面板。

    <Window x:Class="TabTest.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:TabTest"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Grid>
            <Border Name="emptyTabPanel" Grid.Row="1" BorderBrush="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}" 
                                BorderThickness="1,1,1,1" Margin="5,0,5,5" Visibility="Hidden">
            </Border>
            <TabControl Name="MainTabControl" Visibility="Visible">
                <TabControl.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Label Content="{Binding Header}" MinWidth="60"/>
                            <Button BorderThickness="0" Background="Transparent" Height="16" Width="15" Margin="15,2,0,0">
                                <Image Source="images/close.png" Height="8"/>
                            </Button>
                        </StackPanel>
                    </DataTemplate>
                </TabControl.ItemTemplate>
            </TabControl>
        </Grid>
    </Window>

using System.Windows;
using System.Collections.ObjectModel;

namespace TabTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private ObservableCollection<TabEntry> tabEntries;

        public MainWindow()
        {
            InitializeComponent();

            tabEntries = new ObservableCollection<TabEntry>();
            MainTabControl.ItemsSource = tabEntries;

            for (int i = 1; i <= 5; i++)
            {
                tabEntries.Add(new TabEntry { Header = "tab " + i });
            }
        }
    }

    public class TabEntry
    {
        public string Header { get; set; }
    }
}

标签: c#wpf.net-core

解决方案


所有 ItemsControls 都提供了一个HasItems可以在触发器中使用的属性。与 DataTrigger 相比,ItemsSource.Count这在根本没有设置 ItemsSource 时也可以工作。

<TabControl ...>
    <TabControl.Style>
        <Style TargetType="TabControl">
            <Style.Triggers>
                <Trigger Property="HasItems" Value="False">
                    <Setter Property="Visibility" Value="Collapsed" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </TabControl.Style>
    ...
</TabControl>

推荐阅读