es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo pasar la información del modelo a un ViewModel de control de usuario que está en una ventana principal?

Estoy intentando aprender el patrón MVVM creando una interfaz gráfica de usuario simple utilizando WPF. Es solo un complemento simple para AutoCAD (https://en.wikipedia.org/wiki/AutoCAD) con una ventana modal que muestra información sobre el modelo.

Tengo dos UserControls con sus respectivas vistas y modelos de vista. Estoy mostrando estos UserControls en una sola ventana/diálogo. Uno de estos UserControls necesita mostrar información, representando una lista simple (el modelo) en un DataGrid.

Como dije antes, el modelo para ese UserControl es una lista existente. Necesito pasar la información de la lista al modelo de vista, pero estoy luchando con esto. Estaba pensando en pasarlo como parámetro al constructor de MainWindow y luego al modelo de vista respectivo, pero no suena como una buena idea.

¿Qué opciones tengo en este caso?

Estoy utilizando MVVM Toolkit.

¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución

    En este caso, el enfoque más adecuado sería utilizar Inyección de Dependencias para pasar la información de la Lista desde la Ventana Principal al correspondiente ViewModel. Hay varios frameworks de Inyección de Dependencias que son compatibles con MVVM Toolkit, como Unity, Ninject y SimpleInjector.

    Primero, necesitarías registrar la Lista como una dependencia en tu contenedor de Inyección de Dependencias. Luego, inyectarías la dependencia en el constructor del ViewModel, de la siguiente manera:

    public class MyViewModel : ViewModelBase
    {
        private readonly List<mymodel> _myList;
    
        public MyViewModel(List<mymodel> myList)
        {
            _myList = myList;
        }
    
        // el resto del código de tu ViewModel aquí
    }
    

    Finalmente, en el código detrás de tu MainWindow, resolverías la dependencia y se la pasas al constructor del ViewModel:

    public MainWindow()
    {
        InitializeComponent();
    
        var container = new UnityContainer(); // o cualquier contenedor de Inyección de Dependencias que elijas
    
        var myList = new List<mymodel>(); // tu Lista existente aquí
    
        container.RegisterInstance(myList); // registra tu Lista como una dependencia
    
        var viewModel = container.Resolve<myviewmodel>(new DependencyOverride<><mymodel>>(myList));
        DataContext = viewModel;
    }
    

    De esta manera, tu ViewModel tendrá acceso a la información de la Lista sin depender del constructor de la Ventana Principal. Esto también hace que tu código sea más modular y testeable, ya que puedes fácilmente reemplazar dependencias por diferentes implementaciones durante las pruebas unitarias o el desarrollo futuro.

Comments are closed.