2017-05-17 62 views
0

我想通過數據綁定動態添加並從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來實現。 但是,我想明白,爲什麼我的版本不起作用。

+0

那麼,你當然不能更新'SelectedTab'就像你在做'PropertyChanged'一樣。你是否爲了簡潔而忽略它?而'Tabs'需要是'ObservableCollection ',而不是'List'。否則,「TabControl」應該如何知道任何變化? –

+0

你不應該在一個窗口上實現'INotifyPropertyChanged',通常是一個List或ObservableCollection類似於'TabItem'的控件類型,但是'TabControl'對於這個規則來說是一種特例,通常是一個非常糟糕的主意,因爲*嘟m虛擬化*。 –

回答

0

但是,我想明白,爲什麼我的版本不起作用。

因爲您綁定的是List<TabItem>而不是ObservableCollection<TabItem>。如果你簡單地更改源收集它的作品的類型:

public ObservableCollection<TabItem> Tabs { get; set; } 
public TabItem SelectedTab { get; set; } 
public MainWindow() 
{ 
    InitializeComponent(); 
    Tabs = new ObservableCollection<TabItem>(); 
} 

兩個集合類型之間的區別是,後者實現了INotifyCollectionChanged接口。如果您希望視圖中的ItemsControl在向源集合添加項目或從源集合中移除項目時自動更新,則需要實現此接口。

相關問題