Enlace de datos WPF a patrones de clase compuestos?
Estoy probando WPF por primera vez y estoy luchando con cómo enlazar los controles a una clase que se construye usando la composición de otros objetos. Por ejemplo, si tengo una clase Comp que se compone de dos clases separadas (tenga en cuenta varios elementos que quedan fuera para mayor claridad):
class One {
int _first;
int _second;
}
class Two {
string _third;
string _fourth;
}
class Comp {
int _int1;
One _part1;
Two _part2;
}
Ahora entiendo que puedo enlazar fácilmente _int1 usando un "get" definido en Comp. Pero, ¿cómo puedo enlazar a los elementos _part1._first, _part1._second? ¿Tengo exponer "getters" para ellos en el nivel Comp de clase? o ¿puedo exponerlas dentro de las clases compuestas y usar una ruta de enlace que las apunte? ¿Y cómo funciona esto con la configuración de las propiedades?
¿Así es este el patrón?
....
<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;
...
¿O es este el patrón? (donde no estoy seguro de qué poner para el camino)
....
<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;
...
¿O estoy en mi camino para reinventar M-V-VM (que poco a poco estoy empezando a comprender)?
....
<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;
...
Entonces, ¿cómo debo hacer las cosas? Si es el primer o el tercer patrón, entonces parece que he tomado todos mis datos jerárquicos (dispares) encantadores y los he reducido a una configuración plana para poder vincularlos a los elementos de la IU. ¿Es así como tiene que suceder, o hay una mejor manera (segundo patrón?)
Editar
Dejé fuera de la cuestión que realmente quiero unir de manera bidireccional. Por lo tanto, los que acceden a la propiedad realmente deberían haber obtenido y configurado.
Editar
Actualicé mi pseudo código para mostrar los configuradores, así como los captadores
Editar
Seguí el patrón provisto por Mark y Julien e implementé setters y estuve contento con el resultado. Por alguna razón, me convencí a mí mismo de que el establecimiento de una propiedad no seguiría hasta la entidad final.