我想要TabControl
动态TabItems
。我的代码隐藏文件中有一个ObservableCollection
属性,当我向此属性添加元素时,我希望GUI添加一个新的TabItem
元素。
MainWindow.xaml
<TabControl ItemsSource="{Binding ElementName=Window, Path=PositionTabs, Mode=OneWay}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Header, Mode=OneTime}"></TextBlock>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<TextBlock Text="{Binding Content, Mode=OneTime}"></TextBlock>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public ObservableCollection<PositionTab> PositionTabs { get; set; }
public MainWindow()
{
InitializeComponent();
PositionTabs = new ObservableCollection<PositionTab>();
for (int i = 0; i <= 4; i++)
{
PositionTabs.Add(new PositionTab(i));
}
}
}
PositionTab.cs
public class PositionTab
{
public int PosIndex { get; }
public string Header => $"Position {PosIndex + 1}";
public string Content => "Content";
public PositionTab(int posIndex)
{
PosIndex = posIndex;
}
}
当我启动我的应用程序时,我只有一个空的TabControl
。
答案 0 :(得分:2)
您可以移动数据设置:
public MainWindow()
{
PositionTabs = new ObservableCollection<PositionTab>();
for (int i = 0; i <= 4; i++)
{
PositionTabs.Add(new PositionTab(i));
}
InitializeComponent();
}
您遇到的问题是observablecollection最初为null。 这是大多数mvvm开发人员永远不会发生的事情所以它对我们来说看起来很奇怪。 我通常有一个viewmodel,它会实现inotifypropertychanged,当我设置这样一个集合时,它会提升集合中的属性,并且它只是工作。 要做到这一点,所有代码背后都不是通常的做法......但......表明工作:
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public ObservableCollection<PositionTab> PositionTabs { get; set; }
public MainWindow()
{
InitializeComponent();
PositionTabs = new ObservableCollection<PositionTab>();
RaisePropertyChanged("PositionTabs");
for (int i = 0; i <= 4; i++)
{
PositionTabs.Add(new PositionTab(i));
}
}
}