Powiązanie danych WPF ze złożonymi wzorami klas?

Po raz pierwszy wypróbowuję WPF i zmagam się z tym, jak powiązać formanty z klasą zbudowaną przy użyciu kompozycji innych obiektów. Na przykład, jeśli mam klasę Comp, która składa się z dwóch oddzielnych klas (zauważ różne elementy pominięte dla jasności):

class One {
   int _first;
   int _second;
}

class Two {
   string _third;
   string _fourth;
}

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

Teraz rozumiem, że mogę łatwo powiązać _int1 używając „get” zdefiniowanego w Comp. Ale jak mam powiązać z elementami _part1._first, _part1._second. Czy mam dla nich „gettery” na poziomie Comp? lub czy mogę je ujawnić w klasach złożonych i użyć ścieżki wiązania, która na nie wskazuje? A jak to działa przy ustawianiu właściwości?

Czy to jest taki wzór?

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

Czy jest to wzór? (gdzie nie jestem pewien, co wprowadzić ścieżkę)

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

A może jestem w drodze do odkrycia M-V-VM (co powoli zaczynam rozumieć)?

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

Więc jak mam robić rzeczy? Jeśli jest to pierwszy lub trzeci wzorzec, wygląda na to, że wziąłem wszystkie moje piękne (różne) dane hierarchiczne i sprowadziłem je do płaskiej konfiguracji, dzięki czemu mogę powiązać je z elementami interfejsu użytkownika. Czy tak ma się stać, czy jest lepszy sposób (drugi wzór?)

Edytować

Wyszedłem z pytania, że ​​naprawdę chcę dwukierunkowego wiązania. Więc właściciele obiektów naprawdę powinni mieć i ustawić.

Edytować

Zaktualizowałem mój pseudo kod, aby pokazać setery i gettery

Edytować

Podążyłem za wzorem podanym przez Marka i Juliena i zaimplementowałem setery i byłem zadowolony z wyniku. Z jakiegoś powodu przekonałem się, że ustawienie nieruchomości nie nastąpi aż do ostatecznego podmiotu.

questionAnswers(2)

yourAnswerToTheQuestion