我有一个WPF .NET核心应用程序,其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; }
}
}发布于 2019-12-08 18:20:57
所有ItemsControls都提供了可在触发器中使用的HasItems属性。与ItemsSource.Count上的DataTrigger相比,当根本不设置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>发布于 2019-12-08 18:09:31
您可以使用样式中的DataTriger来完成此操作。请注意,您需要删除Visibility="Visible",否则设置程序将无法更改它。
<TabControl Name="MainTabControl" Background="Red">
<TabControl.Style>
<Style TargetType="TabControl">
<Style.Triggers>
<DataTrigger Binding="{Binding ItemsSource.Count, RelativeSource={RelativeSource Self}}" Value="0">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</TabControl.Style>
<TabControl.ItemTemplate>
<!-- and so on -->发布于 2019-12-08 16:47:00
为此,您需要一个适当的视图模型,而不是将选项卡直接绑定到集合。该视图模型将包含一个HasItems属性,您将把TabControl可见性绑定到该属性,以及一个反向属性--比如IsEmpty,您将把面板的可见性绑定到该属性。
绑定ObservableCollection的events来监听项目计数的变化,并为视图模型适当地引发PropertyChanged事件。
https://stackoverflow.com/questions/59233760
复制相似问题