Dies ist keine MVVM. Sie sollten keine UI-Elemente in Ihrem Ansichtsmodell erstellen.
Sie sollten die ItemsSource der Registerkarte an Ihre ObservableCollection binden, und diese sollte Modelle mit Informationen zu den Registerkarten enthalten, die erstellt werden sollen.
Hier sind die VM und das Modell, das eine Registerkarte darstellt:
public sealed class ViewModel
{
public ObservableCollection<TabItem> Tabs {get;set;}
public ViewModel()
{
Tabs = new ObservableCollection<TabItem>();
Tabs.Add(new TabItem { Header = "One", Content = "One's content" });
Tabs.Add(new TabItem { Header = "Two", Content = "Two's content" });
}
}
public sealed class TabItem
{
public string Header { get; set; }
public string Content { get; set; }
}
Und so sehen die Bindungen im Fenster aus:
<Window x:Class="WpfApplication12.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<ViewModel
xmlns="clr-namespace:WpfApplication12" />
</Window.DataContext>
<TabControl
ItemsSource="{Binding Tabs}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock
Text="{Binding Header}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<TextBlock
Text="{Binding Content}" />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</Window>
(Hinweis: Wenn Sie unterschiedliche Inhalte in unterschiedlichen Registerkarten verwenden möchten, verwenden Sie DataTemplates
. Entweder sollte das Ansichtsmodell jeder Registerkarte eine eigene Klasse sein, oder Sie erstellen eine benutzerdefinierte Klasse, DataTemplateSelector
um die richtige Vorlage auszuwählen.)
Ein UserControl in der Datenvorlage:
<TabControl
ItemsSource="{Binding Tabs}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock
Text="{Binding Header}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<MyUserControl xmlns="clr-namespace:WpfApplication12" />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>