Самое простое решение - связать источник элемента элемента управления вкладкой со списком моделей представлений. Затем, если вы добавляете / удаляете модели представлений, вкладки добавляются / удаляются соответственно.
Главное окно xaml:
<Grid>
<Grid.Resources>
<DataTemplate x:Key="CustomHeaderTemplate">
<Label Content="{Binding TabName}" />
</DataTemplate>
</Grid.Resources>
<TabControl x:Name="tbCtrl" ItemsSource="{Binding Items}" Loaded="tbCtrl_Loaded" SelectionChanged="tbCtrl_SelectionChanged" ItemTemplate="{StaticResource CustomHeaderTemplate}">
<TabControl.ContentTemplate>
<DataTemplate>
<uc:DeviceTab/>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</Grid>
Важным моментом является привязка ItemSource
.
Модель представления элемента управления вкладкой:
class TabControlViewModel
{
public ObservableCollection<ItemViewModel> Items { get; } = new ObservableCollection<ItemViewModel>();
}
Код элемента управления вкладкой за событием Loaded. Здесь вы можете добавить модели представления, и элемент управления вкладками настраивает вкладки соответствующим образом:
private void tbCtrl_Loaded(object sender, RoutedEventArgs e)
{
var tabControlViewModel = new TabControlViewModel();
tabControlViewModel.Items.Add(new ItemViewModel());
DataContext = tabControlViewModel;
tbCtrl.SelectedIndex = 0;
}
Это работает, только если все вкладки одинаковы. Существует также решение, если вам нужны разные пользовательские элементы управления для каждой вкладки. В этом случае вам необходимо указать шаблон данных для содержимого элемента вкладки. По сути, вы можете сказать ему загружать пользовательские элементы управления в зависимости от типа модели представления. К сожалению, я не знаю, как это сделать, но я видел примеры для этого. Я знаю, что это не точный ответ, который вам нужен, но я надеюсь, что это поможет!