WPF привязка данных к шаблонам составных классов?

Я впервые пробую WPF и пытаюсь связать элементы управления с классом, созданным с использованием композиции других объектов. Например, если у меня есть класс Comp, который состоит из двух отдельных классов (обратите внимание на различные элементы, оставленные для ясности):

class One {
   int _first;
   int _second;
}

class Two {
   string _third;
   string _fourth;
}

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

Теперь я понимаю, что могу легко связать _int1, используя & quot; get & quot; определено в Comp. Но как мне привязать элементы _part1._first, _part1._second. Должен ли я разоблачить «добытчики»? для них на уровне класса Comp? или я могу выставить их в составных классах и использовать путь привязки, который указывает на них? И как это работает с настройкой свойств?

Таким образом, это шаблон?

....
<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;
...

Или это шаблон? (где я не уверен, что поставить на путь)

....
<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;
...

Или я собираюсь заново изобрести M-V-VM (которую я постепенно начинаю понимать)?

....
<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;
...

Так как я должен делать вещи? Если это первый или третий шаблон, то кажется, что я взял все свои прекрасные (разрозненные) иерархические данные и распределил их до плоской конфигурации, чтобы связать их с элементами пользовательского интерфейса. Это так должно происходить, или есть лучший способ (второй шаблон?)

Edit

Я оставил вне вопроса, что я действительно хочу двухстороннее связывание. Таким образом, методы доступа к свойствам действительно должны быть получены и установлены.

Edit

Обновил мой псевдокод, чтобы показать как сеттеры, так и геттеры

Edit

Я следовал шаблону, предоставленному Марком и Жюльеном, внедрял сеттеры и был доволен результатом. По какой-то причине я убедил себя, что установка свойства не будет следовать вплоть до конечной сущности.

Ответы на вопрос(2)

Ваш ответ на вопрос