Estado de las vistas (y II)


Como ya había comentado las vistas deberán actualizarse cuando su estado cambie dependiendo de las acciones que lleve a acabo el usuario, es decir, los controles deberán activarse, desactivarse, etc… cada vez que el estado de la vista cambie.

Finalmente, y tras descartar el uso de los triggers que por lo que he visto no valdrían ( aunque igual estoy equivocado, mis conocimientos de WPF son limitados🙂 ), he decidido implementarlo con una solución similar a la explicada por Jeremy D. Miller en su serie de como construir tú propio CAB, la implementación es diferente pero la idea es la misma.

ViewStateMachineDiagram

La diferencia está en que en mi caso el cambio de estado lo que hará será ejecutar una serie de tareas en el mismo orden en el que se han añadido en el ControlState asociado a un estado determinado.

Las vistas tendrán 2 métodos uno para configurar los estados y otro para actualizar el estado cuando este cambie.

   1: public DivisasViewModel ViewModel
   2: {
   3:     set
   4:     {
   5:         this.viewModel      = value;
   6:         this.DataContext    = value;
   7: 
   8:         this.viewModel.ViewModelStateChanged += delegate
   9:         {
  10:             this.UpdateState();
  11:         };
  12: 
  13:         this.UpdateState();
  14:     }
  15: }
   1: protected override void OnInitialized(EventArgs e)
   2: {
   3:     base.OnInitialized(e);
   4:     this.ConfigureStateMachine();
   5: }
   6: 
   7: protected void UpdateState()
   8: {
   9:     this.viewStateMachine.SetState(this.viewModel.ViewModelState.ToString());
  10: }
   1: private void ConfigureStateMachine()
   2: {
   3:     this.viewStateMachine = new ViewStateMachine<string>();
   4: 
   5:     this.viewStateMachine.OnStateChangeTo(ViewModelStateType.Busy.ToString())
   6:         .Disable(this.VisualRoot, typeof(Control), typeof(TabControl))
   7:         .Disable(this.DataGridCambios, this.DataGridArqueos);
   8: 
   9:     this.viewStateMachine.OnStateChangeTo(ViewModelStateType.Default.ToString())
  10:         .Disable(this.VisualRoot, typeof(Control), typeof(TabControl))
  11:         .Disable(this.DataGridCambios, this.DataGridArqueos)
  12:         .Enable(this.txtDivisa)
  13:         .Enable(this.Searcher)
  14:         .SetFocus(this.txtDivisa);
  15: 
  16:     this.viewStateMachine.OnStateChangeTo(ViewModelStateType.AddingNew.ToString())
  17:         .Enable(this.VisualRoot, typeof(Control))
  18:         .Enable(this.DataGridCambios, this.DataGridArqueos)
  19:         .SetFocus(this.txtDivisa);
  20: 
  21:     this.viewStateMachine.OnStateChangeTo(ViewModelStateType.Editing.ToString())
  22:         .Enable(this.VisualRoot, typeof(Control))
  23:         .Enable(this.DataGridCambios, this.DataGridArqueos)
  24:         .Disable(this.txtDivisa)
  25:         .SetFocus(this.txtRedondeo);
  26: }

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s