我正在将一个GroupViewModel
(GroupModel是一个业务概念)绑定到TabControl.ItemsSource
。
我需要在这个TabControl的末尾添加一个标签,该选项卡具有(+)符号,类似于用于添加新选项卡的Web浏览器上的最后一个选项卡。
我想我可以将TabControl.ItemsSource
绑定到GroupViewModel
集合以构建我的选项卡,然后调用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和相应的模型?
谢谢,
菲利普
发布于 2014-03-02 20:45:52
我试过这样做:
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();
}
}
}
视图-模式:
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;
}
https://stackoverflow.com/questions/22135884
复制