Ligação de dados do WPF aos padrões de classes compostas?

Eu estou experimentando o WPF pela primeira vez e estou lutando com como vincular controles a uma classe que é construída usando a composição de outros objetos. Por exemplo, se eu tiver a classe Comp que é composta de duas classes separadas (observe vários elementos deixados de fora para maior clareza):

class One {
   int _first;
   int _second;
}

class Two {
   string _third;
   string _fourth;
}

class Comp {
   int _int1;
   One _part1;
   Two _part2;
}

Agora eu entendo que posso facilmente ligar _int1 usando um "get" definido no Comp. Mas como faço para ligar aos elementos _part1._first, _part1._second. Eu tenho expor "getters" para eles no nível Comp da classe? ou posso expô-los dentro das classes compostas e usar um caminho de ligação que aponta para eles? E como isso funciona com a configuração das propriedades?

Assim é este o padrão?

....
<TextBlock Name="txtBlock" Text="{Binding Path=Third}" />    
....

class One {
   int _first;
   int _second;
}

class Two {
   string _third;
   string _fourth;
}

class Comp {
   int _int1;
   One _part1;
   Two _part2;

   int Int1 { get { return _int1; } set { _int1 = value; } }
   int First { get { return _part1._first; }  set { _part1._first = value; } }
   int Second { get { return _part1._second; } set { _part1._second = value; } }
   string Third { get { return _part2._third; }  set { _part2._third = value; } }
   string Fourth { get { return _part2.fourth; }  set { _part2._fourth = value; } }
}

...
Comp oComp = new Comp();
txtBlock.DataContext = oComp;
...

Ou este é o padrão? (onde não tenho certeza do que colocar no caminho)

....
<TextBlock Name="txtBlock" Text="{Binding Path=_part2.Third}" />    
....

class One {
   int _first;
   int _second;
   int First { get { return _first; }  set { _first = value; } }
   int Second { get { return _second; }  set { _second = value; } }
}

class Two {
   string _third;
   string _fourth;
   string Third { get { return _third; } set { _third = value; } }
   string Fourth { get { return _fourth; } set { _fourth = value; } }
}

class Comp {
   int _int1;
   One _part1;
   Two _part2;

   int Int1 { get { return _int1; } }
}

...
Comp oComp = new Comp();
txtBlock.DataContext = oComp;
...

Ou estou no meu caminho para reinventar o M-V-VM (que eu estou lentamente começando a compreender)?

....
<TextBlock Name="txtBlock" Text="{Binding Path=Third}" />    
....

class One {
   int _first;
   int _second;
}

class Two {
   string _third;
   string _fourth;
}

class Comp {
   int _int1;
   One _part1;
   Two _part2;

}

class CompView {
   Comp _comp;

   CompView( Comp comp ) {
      _comp = comp;
   }

   int Int1 { get { return _comp._int1; } set { _comp._int1 = value; } }
   int First { get { return _comp._part1._first; }  set { _comp._part1._first = value; } }
   int Second { get { return _comp._part1._second; } set { _comp._part1._second = value; } }
   string Third { get { return _comp._part2._third; }  set { _comp._part2._third = value; } }
   string Fourth { get { return _comp._part2.fourth; }  set { _comp._part2._fourth = value; } }
 }

...
Comp oComp = new Comp();
CompView oCompView = new CompView( oComp );
txtBlock.DataContext = oCompView;
...

Então, como devo fazer as coisas? Se for o primeiro ou o terceiro padrão, então parece que peguei todos os meus dados hierárquicos (diferentes) e os limpei em uma configuração simples para que eu possa vinculá-los aos elementos da interface do usuário. É assim que tem que acontecer, ou existe uma maneira melhor (segundo padrão?)

Editar

Eu deixei de fora a questão que eu realmente quero de duas maneiras. Assim, os assessores de propriedade deveriam ter conseguido e definido.

Editar

Atualizei meu pseudo código para mostrar setters e getters

Editar

Eu segui o padrão fornecido por Mark e Julien e implementei setters e fiquei feliz com o resultado. Por alguma razão, me convenci de que o estabelecimento de uma propriedade não seguiria todo o caminho até a entidade final.

questionAnswers(2)

yourAnswerToTheQuestion