c# - 项目源列表为空时如何隐藏选项卡控件
问题描述
我有一个 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; }
}
}
解决方案
所有 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>
推荐阅读
- java - 使用 EventBus 时处理 Vert.x NetSocket writeQueueFull
- javascript - TypeScript 返回不可变/常量/只读数组
- python - Jira POST & PUT Rest 调用从 Python 返回错误 400
- julia - 在 Julia-Lang 中包含文件以考虑更新的正确方法
- c++ - 抛出异常:读取访问冲突。我的代码有什么问题?
- powershell - 根据唯一属性将数组拆分为单独的对象
- c++ - 显示qml时如何在QML中播放声音
- .net - 使用 Serilog 自定义 LogEventLevel
- mysql - PDO Mysql 创建函数并在select中使用
- php - 银条 - CMS - 登录用户名和密码