Por que essas guias parecem compartilhar a mesma caixa de texto?

Eu defini minha interface no xaml e abaixo está o meu código:

<TabControl HorizontalAlignment="Left" Height="330" VerticalAlignment="Top" Width="764" Margin="10,10,0,0" ItemsSource="{Binding AllTabs}" SelectedItem="{Binding SelectedTab}">
        <TabControl.ItemContainerStyle>
            <Style TargetType="TabItem">
                <Setter Property="Header" Value="{Binding Header}"/>
                <Setter Property="Content">
                    <Setter.Value>
                        <Grid>
                            <TextBox Text="{Binding Text}" FontSize="16" AcceptsReturn="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                            </TextBox>
                        </Grid>
                    </Setter.Value>
                </Setter>
                <Setter Property="FontSize" Value="20"/>
            </Style>
        </TabControl.ItemContainerStyle>
    </TabControl>

Quando eu corri meu programa. Eu poderia adicionar muitas abas sem nenhum problema. Os cabeçalhos são diferentes, mas sempre que altero o conteúdo da caixa de texto em uma das guias, todas as caixas de texto de outras guias são alteradas para o mesmo conteúdo (parece que todas compartilhavam a mesma caixa de texto ou eram vinculadas à mesma fonte) .

Eu cometi um erro ao definir a interface do usuário? Por favor me ajude e obrigado antecipadamente.

Este é o meu modelo, muito simples:

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace MyHomework__MVVM_
{
    class MyHomeworkModel : INotifyPropertyChanged
    {
        private string header, text;
        public event PropertyChangedEventHandler PropertyChanged;

        public string Header
        {
            get
            {
                return header;
            }
            set
            {
                header = value;
                OnPropertyChanged("Header");
            }
        }

        public string Text
        {
            get
            {
                return text;
            }
            set
            {
                text = value;
                OnPropertyChanged("Text");
            }
        }

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

E o meu viewmodel, que ainda é muito simples:

using MyHomework;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Input;

namespace MyHomework__MVVM_
{
    class MyHomeworkViewModel : INotifyPropertyChanged
    {
        private ObservableCollection<MyHomeworkModel> allTabs;
        private MyHomeworkModel selectedTab;
        public event PropertyChangedEventHandler PropertyChanged;

        public MyHomeworkViewModel()
        {
            allTabs = new ObservableCollection<MyHomeworkModel>();
            selectedTab = new MyHomeworkModel();
            AddCourseCommand = new AddCourseCommand(this);
        }

        public ObservableCollection<MyHomeworkModel> AllTabs
        {
            get
            {
                return allTabs;
            }
            set
            {
                allTabs = value;
                OnPropertyChanged("AllTabs");
            }
        }

        public MyHomeworkModel SelectedTab
        {
            get
            {
                return selectedTab;
            }
            set
            {
                selectedTab = value;
                OnPropertyChanged("SelectedTab");
            }
        }

        public ICommand AddCourseCommand
        {
            get;
            private set;
        }

        public void AddNewTab()
        {
            NewCourseName ncn = new NewCourseName();
            ncn.ShowDialog();
            if (ncn.courseName != null)
            {
                MyHomeworkModel newTab = new MyHomeworkModel();
                newTab.Header = ncn.courseName;
                newTab.Text = ncn.courseName;
                AllTabs.Add(newTab);
                SelectedTab = newTab;
            }
        }

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

EDIT: Só notei que recebi esta mensagem:

System.Windows.Data Error: 40 : BindingExpression path error: 'Text' property not found on 'object' ''MyHomeworkViewModel' (HashCode=31265986)'. BindingExpression:Path=Text; DataItem='MyHomeworkViewModel' (HashCode=31265986); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String')

Eu acho que sei porque está reclamando. Minha propriedade de texto é MyHomeworkModel não MyHomeworkViewModel ... mas por que está tudo bem comigo vinculando o cabeçalho à propriedade Header em MyHomeworkModel?

Minha classe AddCourseCommand:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace MyHomework__MVVM_
{
    class AddCourseCommand : ICommand
    {
        private MyHomeworkViewModel viewModel;

        public AddCourseCommand(MyHomeworkViewModel viewModel)
        {
            this.viewModel = viewModel;
        }

        public event EventHandler CanExecuteChanged
        {
            add
            {
                CommandManager.RequerySuggested += value;
            }
            remove
            {
                CommandManager.RequerySuggested -= value;
            }
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            viewModel.AddNewTab();
        }
    }
}

questionAnswers(1)

yourAnswerToTheQuestion