Hi,
you can set in main ViewModel an ID in each instance of Tab1ViewModel. In Tab1ViewModel you can set a reference to ViewModel to get information from main ViewModel. Try following demo:
XAML:
<Window x:Class="Window071"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1.WpfApp071"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<Window.Resources>
<DataTemplate DataType="{x:Type local:Tab1ViewModel}">
<local:Tab1View/>
</DataTemplate>
</Window.Resources>
<Grid>
<TabControl ItemsSource="{Binding View}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding TabTitle}"/>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding MainViewModel.MainText}"/>
<TextBlock Text="{Binding Text}"/>
</StackPanel>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</Grid>
</Window>
Code:
Imports System.Collections.ObjectModel
Namespace WpfApp071
Public Class ViewModel
Public Sub New()
For i = 1 To 10
View.Add(New Tab1ViewModel With {.MainViewModel = Me, .TabTitle = $"TabItem {i}", .Text = $"Text in TabItem {i}"})
Next
End Sub
Public Property View As New ObservableCollection(Of Tab1ViewModel)
Public Property MainText As String = "Text from MainWindow"
End Class
Public Class Tab1ViewModel
Public Property MainViewModel As ViewModel
Public Property TabTitle As String
Public Property Text As String
End Class
Public Class Tab1View
Inherits TabItem
End Class
End Namespace
in C#:
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
namespace WpfApp1
{
namespace WpfApp071
{
public class ViewModel
{
public ViewModel()
{
for (int i = 1; i <=10; i++)
View.Add(new Tab1ViewModel { MainViewModel = this, TabTitle = $"TabItem {i}", Text = $"Text in TabItem {i}" });
}
public ObservableCollection<Tab1ViewModel> View { get; } = new ObservableCollection<Tab1ViewModel>();
public string MainText { get; set; } = "Text from MainWindow";
}
public class Tab1ViewModel
{
public ViewModel MainViewModel { get; set; }
public string TabTitle { get; set; }
public string Text { get; set; }
}
public class Tab1View : TabItem { }
}
}
Result: