none
A vueltas con el MVVM RRS feed

  • Pregunta

  • Buenas,

    Sigo peleando con la implementación de MVVM y no consigo el resultado que quiero. Me explico:

    Tengo el MainWindow con un grid vacío en el medio al que asigno los diferentes controles de usuario que voy necesitando. Esto funciona bien y consigo que cada formulario funcione correctamente, pero no consigo interactuar con el ViewModel del MainWindow desde los diferentes controles de usuario.

    Tengo una clase Usuario y un ViewModel que llamo Principal. Este ViewModel lo tengo para guardar la información global, es decir, el Usuario que está conectado en ese momento, por lo que tengo un UsuarioActivo en el ViewModel.

    Si intento cambiar los datos del UsuarioActivo desde un control de usuario, al crear un punto de interrupción veo que INotifyPropertyChanged está funcionando y que los campos se actualizan, pero no cambian los campos a los que tengo hecho Binding.

    ¿Tengo que acceder a ese modelo de algún modo concreto?

    ¿No es posible tener una vista con varios viewmodels?

    Muchas gracias por vuestra ayuda


    Aprendiendo a programar.

    domingo, 1 de marzo de 2015 14:28

Respuestas

  • Si me dice que los VM's de los controles son propios para cada control, entonces si agrega más de un control a la grilla, entonces imagino que necesita un VM distinto para cada uno de esos controles.  ¿Estoy en lo cierto?  En ese caso yo me iría por contención, no herencia.

    namespace XXX.ViewModels
    {
        //El VM "maestro".
        public class Principal : AlgunaBaseComunParaLosVMs
        {
            ...
        }
    
        //El VM base para todos los VM's que son VM's de algún control:
        public class ControlVMBase : AlgunaBaseComunParaLosVMs
        {
            public Principal Maestro { get; set; }
        }
    
        //Algún VM de algún control:
        public class AlgunVM : ControlVMBase
        {
            ...
        }
    }

    De esa forma todos los VM's que son para los controles tendrán una propiedad llamada Maestro que apuntará a una instancia de un VM Principal.  Ahora lo único que hay que hacer es generar un único VM maestro con los datos globales, y luego, cuando se agrega un control, se prepara el VM de ese control asignando el VM maestro a la propiedad Maestro.  Ahora en los VM's de los controles usted podrá manipular el VM global a su gusto.


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Dario Alonso lunes, 2 de marzo de 2015 20:03
    lunes, 2 de marzo de 2015 19:59

Todas las respuestas

  • Si entendí bien, usted tiene un formulario con una grilla de posicionamiento en donde coloca controles en tiempo de ejecución dependiendo de lo que desea.  ¿Entendí bien esta parte?

    Dice que tiene un VM "maestro" con los datos globales. ¿Quiere decir que también alimenta un VM específico dependiendo de la situación?  ¿Cómo hace usted esto:  Usa herencia donde los VM's epsecíficos heredan dle VM maestro o es algo más?


    Jose R. MCP
    Code Samples

    lunes, 2 de marzo de 2015 18:07
  • Exacto, los controles aparecen sólo en tiempo de ejecución.

    En cuanto a los ViewModels, cada control tiene su propio ViewModel y lo que intento es poder interactuar entre el ViewModel "maestro" y los ViewModels de cada control.

    ¿Es posible hacerlo?¿Necesito que los ViewModels de los controles hereden del ViewModel "maestro"?

    Pregunto por desconocimiento y por intentar aplicar "buenas prácticas", aunque creo que no tengo el enfoque adecuado todavía.

    Muchas gracias por la ayuda.


    Aprendiendo a programar.

    lunes, 2 de marzo de 2015 19:50
  • Si me dice que los VM's de los controles son propios para cada control, entonces si agrega más de un control a la grilla, entonces imagino que necesita un VM distinto para cada uno de esos controles.  ¿Estoy en lo cierto?  En ese caso yo me iría por contención, no herencia.

    namespace XXX.ViewModels
    {
        //El VM "maestro".
        public class Principal : AlgunaBaseComunParaLosVMs
        {
            ...
        }
    
        //El VM base para todos los VM's que son VM's de algún control:
        public class ControlVMBase : AlgunaBaseComunParaLosVMs
        {
            public Principal Maestro { get; set; }
        }
    
        //Algún VM de algún control:
        public class AlgunVM : ControlVMBase
        {
            ...
        }
    }

    De esa forma todos los VM's que son para los controles tendrán una propiedad llamada Maestro que apuntará a una instancia de un VM Principal.  Ahora lo único que hay que hacer es generar un único VM maestro con los datos globales, y luego, cuando se agrega un control, se prepara el VM de ese control asignando el VM maestro a la propiedad Maestro.  Ahora en los VM's de los controles usted podrá manipular el VM global a su gusto.


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Dario Alonso lunes, 2 de marzo de 2015 20:03
    lunes, 2 de marzo de 2015 19:59
  • Muchas gracias.


    Aprendiendo a programar.

    lunes, 2 de marzo de 2015 20:04