c# - beginner - mvvm español
Pregunta de diseño MV-VM. Llamando Vista desde ViewModel (5)
Utilizamos una variante en este patrón. Aquí tenemos controladores que representan la VM, por lo que el contexto de datos de la Vista es la VM y nuestras DTO son propiedades de la VM / Controller. Aún lo llamamos controlador ya que usamos esto como el punto de control y manejamos cierto comando desde la Vista. Esto es (creo) donde implementaríamos el comando como el tuyo.
Acabo de comenzar a buscar MV-VM para una aplicación WPF. Todo tiene sentido hasta ahora además de este problema en particular ...
Tengo un ViewModel Llamaré a Search. Este ViewModel se une a una cuadrícula de datos y enumera los resultados de los elementos. Ahora, tengo un comando que necesita mostrar otra vista , los detalles del elemento.
Poner la lógica para mostrar otra vista en la vista de búsqueda no parece correcta, no es comprobable en absoluto.
Aquí está mi implementación de ViewModel, que no es comprobable ...
public class SearchViewModel
{
public void SelectItem()
{
// I want to call the DetailsView from here
// this seems wrong, and is untestable
var detailsView = new DetailsView();
detailsView.Show();
}
}
¿Dónde va la lógica para mostrar una vista desde un método de ViewModel en este patrón?
Como Kiff notó:
Las vistas nunca se deben instanciar en ningún lugar "debajo" de la capa de la interfaz de usuario. Las máquinas virtuales existen debajo de ese ámbito, por lo tanto, este no es el lugar para poner esa lógica (como ya se ha dado cuenta).
Casi siempre habrá algún evento de nivel de interfaz de usuario que indicará la necesidad de crear la vista. En su ejemplo, podría ser un evento de clic de fila (doble) en la cuadrícula de datos. Ese sería el lugar para recargar y mostrar su ventana DetailsView.
Debes darte cuenta de que MV-VM es ligeramente diferente de otros patrones como MVC o MVP. ViewModel no tiene conocimiento directo de la UI. Abrir otra vista es una función específica de la vista. Al modelo de visualización no le importa qué o cuántas vistas utilizan sus datos. Lo más probable es que nunca abra la vista a través de un comando.
texto alternativo http://blogs.msdn.com//johngossman/attachment/576163.ashx
Las vistas nunca se deben instanciar en ningún lugar "debajo" de la capa de la interfaz de usuario. Las máquinas virtuales existen debajo de ese ámbito, por lo tanto, este no es el lugar para poner esa lógica (como ya se ha dado cuenta).
Casi siempre habrá algún evento de nivel de interfaz de usuario que indicará la necesidad de crear la vista. En su ejemplo, podría ser un evento de clic de fila (doble) en la cuadrícula de datos. Ese sería el lugar para recargar y mostrar su ventana DetailsView.
Aquí hay una regla básica sobre esto.
Si está manejando acciones locales en su vista, puede iniciar desde el modelo de vista.
Si se trata de una vista cruzada (como mostrar una pantalla de búsqueda), utilice un patrón EventAggregator (un servicio de eventos) o inserte un Application Controller en el que invoque los métodos y, a su vez, muestre la búsqueda.
Catel incluye un enfoque que implica el uso de IUIVisualizerService
. Esta interfaz define un controlador de UI que se puede usar para mostrar diálogos en forma modal o sin moda desde un ViewModel. Básicamente, dentro de la vm padre, usted crea el modelo de vista que debe permanecer detrás de la nueva vista, y el servicio encuentra el asociado (basado en alguna convención o registro) y luego lo muestra.