c# - galasoft - mvvm light uwp
WPF MVVM Obtener padre de VER MODELO (5)
Desde su llamada a viewmodel
Messenger.Default.Send<NotificationMessage>(new NotificationMessage("Open Window"));
Y desde el código subyacente de su vista ( una vista que llama a la segunda vista ), escriba esto fácilmente en el constructor:
Messenger.Default.Register<NotificationMessage>(this, ReplyToMessage);
Y también escriba este método en el código subyacente de la vista:
private void ReplyToMessage(NotificationMessage msg)
{
if (msg.Notification == "Open Window")
{
SecondWindow win = new SecondWindow();
win.ShowDialog();
}
}
En una aplicación MVVM WPF.
¿Cómo se configura un segundo padre de Windows desde ViewModel
?
ejemplo:
view1
- viewModel1
viewModel1
llamadas de comando de viewModel1
:
var view2 = new view2
view2.Owner
= <---- Esta es el área problemática. ¿Cómo obtengo view1 como propietario aquí desde viewModel
?
view2.Show()
EDITAR:
Vea la respuesta aceptada a continuación, luego lea la siguiente edición.
Estoy usando MVVM light -> http://mvvmlight.codeplex.com/ (awesome btw)
El sistema de mensajes integrados es genial. Ahora estoy enviando un mensaje del viewmodel a mi vista diciéndole que muestre otra ventana.
Para el mensaje, actualmente estoy usando una cadena con una instrucción switch en la vista principal para determinar qué vista abrir; sin embargo, puedo jugar con los tokens que también forman parte del juego de herramientas ligero de MVVM.
¡Gracias!
En mi opinión, abrir una nueva ventana es responsabilidad de View, no de ViewModel. Personalmente, utilizaría el mismo enfoque utilizado para mostrar un cuadro de diálogo (esto ya se discutió en este foro):
Haga que ViewModel envíe un mensaje a la vista solicitando que abra una nueva ventana. (alternativamente) use un IDialogService o lo que sea que quiera llamarlo, que pase al constructor de ViewModel. Este servicio se encargará de abrir la Ventana (o de delegar esta tarea a la Vista). De esta forma, mantendrá una clara separación de preocupaciones y su VM seguirá siendo comprobable (puede verificar que la solicitud para abrir el nuevo WIndow se ha enviado, pero no pudo probar que la ventana ha estado, de hecho, abierta).
¿Tiene sentido?
Aclamaciones,
Laurent
No tengo una respuesta propia, pero aquí hay algunos enlaces a cosas que he estado viendo últimamente que podrían ayudar. También me interesaría cualquier cosa que otros sugirieran.
Tal como lo entiendo, la cuestión clave es que, si es posible, no debería crear vistas desde un modelo de vista , por lo que necesita un medio para comunicar lo que necesita de una manera flexible.
http://www.codeproject.com/KB/WPF/XAMLDialog.aspx
http://www.codeproject.com/KB/architecture/MVVM_Dialogs.aspx
Prism-Event Aggrigator es un buen enfoque, donde podemos crear módulos independientes sin dependencia. primer viewmodel publicará el evento y luego otra vista o vista o viewmodel puede suscribirse a ese evento desde el evento aggrigator.
en este caso, el contenedor Unity también puede usarse para inyectar un modelo de vista en otro con inyección de dependencia.
Puede hacerlo de esta manera, como si necesitara crear algunos eventos y registrarlos a la vista y llamarlos en el modelo de visualización. Abra esa ventana emergente.
Como este ejemplo
public class Mainclass : MainView
{
public delegate abc RegisterPopUp(abc A);
public RegisterPopUp POpUpEvent;
public RelayCommand ShowCommand { private set; get; }
public void ShowCommand()
{
ShowCommand("Your parameter");
}
}
dentro de la vista
MainView mn = new MainView();
Registre el evento aquí como mn.POpUpEvent +=
luego haga clic en el botón de tabulación doble hora y en el método de registros emergentes, escriba el código para abrir la ventana emergente.