我想通過數據綁定動態添加並從wpf TabControl中刪除選項卡。這裏是例子XAML:爲什麼wpf動態標籤不會顯示超過第一個標題?
<Window x:Name="UI_MainWindow" x:Class="DynamicTabs.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:DynamicTabs"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid DataContext="{Binding ElementName=UI_MainWindow, Mode=OneWay}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<Button Content="Add Tab" Click="Click_AddTab"/>
</StackPanel>
<TabControl x:Name="UI_TabControl" Grid.Row="1" ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab}"/>
</Grid>
</Window>
在這裏,後面的代碼:
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
namespace DynamicTabs
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(name));
}
public List<TabItem> Tabs { get; set; }
public TabItem SelectedTab { get; set; }
public MainWindow()
{
InitializeComponent();
Tabs=new List<TabItem>();
}
private void Click_AddTab(object sender,RoutedEventArgs e)
{
TabItem newTab=new TabItem();
newTab.Header="Tab"+(Tabs.Count+1).ToString();
Tabs.Add(newTab);
OnPropertyChanged(nameof(Tabs));
SelectedTab=newTab;
OnPropertyChanged(nameof(SelectedTab));
}
}
}
的行爲是這樣的: 「添加標籤」首先點擊:一個選項卡顯示爲標題「TAB1」 任何進一步點擊「添加選項卡」:TabControl的項目增加,也SelectedItem似乎更新,但沒有新的標題繪製。
我嘗試了一種解決方法(請參閱https://www.codeproject.com/Articles/493538/Add-Remove-Tabs-Dynamically-in-WPF),它通過以編程方式設置TabControl的DataContext來實現。 但是,我想明白,爲什麼我的版本不起作用。
那麼,你當然不能更新'SelectedTab'就像你在做'PropertyChanged'一樣。你是否爲了簡潔而忽略它?而'Tabs'需要是'ObservableCollection',而不是'List'。否則,「TabControl」應該如何知道任何變化? –
你不應該在一個窗口上實現'INotifyPropertyChanged',通常是一個List或ObservableCollection類似於'TabItem'的控件類型,但是'TabControl'對於這個規則來說是一種特例,通常是一個非常糟糕的主意,因爲*嘟m虛擬化*。 –