Ну у вас тут сразу же 2 ошибки.
Первая, DataContext в StackPanel таким образом вы выставить не сможете, потому что у самого окна DataContext пустой. У вас вообще View нигде не пересекается с ViewModel. Хотя как минимум одна точка пересечения быть должна. Обычно это делают в App.xaml.
Открываете App.xaml и удаляете StartupUri. Там же вбиваете Startup и добавляете на это событие обработчик в коде.
private void Application_Startup(object sender, StartupEventArgs e)
{
MainWindow = new MainWindow
{
DataContext = new Service
{
Id = 0,
Info = new InfoService
{
Id = 1,
Main = new ServiceMain { Id = 2, Name = "Тест"}
}
}
};
MainWindow.Show();
}
Вторая: у вас свойства вложенные. Поэтому нужно вложенные TextBox'ы делать. Код приложен с учётом, что вы сделали, как в предыдущем пункте.
<StackPanel>
<TextBlock Text="Service"/>
<TextBox Text="{Binding Path=Id}"/>
<StackPanel DataContext={Binding Info}>
<TextBlock Text="InfoService"/>
<TextBox Text="{Binding Path=Id}"/>
<StackPanel DataContext={Binding Main}>
<TextBlock Text="ServiceMain"/>
<TextBox Text="{Binding Path=Id}"/>
</StackPanel>
</StackPanel>
</StackPanel>
Ну и сразу замечание на будущее. Имеет смысл PropertyChanged и метод RaisePropertyChanged выделить в отдельный класс, от которого в дальнейшем наследовать все ваши ViewModel (Service, InfoService, ServiceMain).