2014-03-03 58 views
0

我绑定GroupViewModel(GroupModel是一个商业概念)到TabControl.ItemsSourceWPF Tabcontrol:混合ItemsSource和Items

我需要在此TabControl的末尾添加一个带有(+)符号并与用于添加新选项卡的Web浏览器上的最后一个选项卡类似的选项卡。

我想我可以只绑定TabControl.ItemsSourceGroupViewModel集合打造出我的标签,然后调用TabControl.Items.Add和添加单个TabItem最后标签与(+)添加更多标签,如下:

TabItem tabItem = new TabItem(); 
tabItem.Header = "+"; 
TabControlDynamic.Items.Add(tabItem); 

然而,这给了我一个错误:

Operation is not valid while ItemsSource is in use. 
Access and modify elements with ItemsControl.ItemsSource instead. 

我想我可以添加一个“虚拟” GroupViewModel我收集的结束,空出来的缘故所有业务相关的值得到最后一个标签,但是这感觉不对。我一直在想,一定有更好的办法。

这是我唯一的选择吗?有没有什么办法可以在最后创建一个选项卡,而不必陪审我的ViewModel和相应的模型?

感谢,

菲利普

回答

1

我已经试过这样:

XAML:

<TabControl ItemsSource="{Binding Items}" SelectionChanged="TabControl_SelectionChanged_1"> 
       <TabControl.ItemTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Header}"/> 
        </DataTemplate> 
       </TabControl.ItemTemplate> 
       <TabControl.ContentTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Content}"/> 
        </DataTemplate> 
       </TabControl.ContentTemplate> 
      </TabControl> 

后面的代码:

private void TabControl_SelectionChanged_1(object sender, SelectionChangedEventArgs e) 
     { 
      TabControl control = sender as TabControl; 
      if (control != null && control.SelectedItem is Tab) 
      { 
       if ((control.SelectedItem as Tab).Header == " ") 
       { 
        (control.SelectedItem as Tab).Header = "New Tab"; 
        (control.DataContext as TabViewModel).Items.Add(new Tab() { Header = " ", Content = "" }); 
        control.UpdateLayout(); 
       } 
      } 
     } 

查看-M odel:

internal class TabViewModel : INotifyPropertyChanged 
    { 
     public void RaisePropertyChanged(string propertyname) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyname)); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private ObservableCollection<Tab> items; 

     public ObservableCollection<Tab> Items 
     { 
      get { return items; } 
      set { items = value; RaisePropertyChanged("Items"); } 
     } 
     public TabViewModel() 
     { 
      items = new ObservableCollection<Tab>(); 
      items.Add(new Tab() { Header = "Tab Item 1", Content = "This is content 1" }); 
      items.Add(new Tab() { Header = "Tab Item 2", Content = "This is content 2" }); 
      items.Add(new Tab() { Header = "Tab Item 3", Content = "This is content 3" }); 
      items.Add(new Tab() { Header = " ", Content = "" }); 
     } 
    } 

    public class Tab:INotifyPropertyChanged 
    { 
     private string header; 

     public string Header 
     { 
      get { return header; } 
      set { header = value; RaisePropertyChanged("Header"); } 
     } 

     private string content; 

     public string Content 
     { 
      get { return content; } 
      set { content = value; RaisePropertyChanged("Content"); } 
     } 
     public void RaisePropertyChanged(string propertyname) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyname)); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
    }