2010-09-18 24 views
5

MVVM no permite código detrás y así manejar eventos. Entonces, ¿cuál es la forma de MVVM para que se le notifique que se ha cambiado una celda?¿Cómo manejar el evento Wpf DataGrid CellEditEnding en MVVM?

+0

Me parece una pregunta legítima, pero tal vez deba ser un poco más prolijo con su pregunta: ¿qué es exactamente lo que no entiende sobre el manejo de ese evento? ¿Desea saber si debe hacerse en la vista o en el modelo de vista? * (Aquí hay una pista: el ViewModel no debe saber nada sobre DataGrid). * – slugster

+0

@slugster - Obviamente no puedo usar este evento ya que MVVM no permite Code Behind. Entonces mi pregunta es ¿qué puedo hacer en lugar de usar este evento? – Erez

+2

MVVM no * prohíbe * código detrás, simplemente * lo desalienta * y le da un patrón para lograr ese ideal. ¿Qué es exactamente lo que necesita hacer una vez que se cambie esa celda de cuadrícula de datos (su respuesta podría dictar el enfoque a seguir)? – slugster

Respuesta

1

Es una pregunta muy legítima y obvia, ya que hay soluciones muy legítimas para el problema de MVVM. Supongo que alguien lo marcó porque probablemente se lo han pedido innumerables veces.

Sé que hay algo incorporado para hacer esto en .Net4. Estoy atrapado en .Net3.5 así que utilizo la clase CommandReference del kit de herramientas WPF, para convertir un evento en la vista en un comando en un modelo de vista.

+0

La solución al problema para MVVM es manejar el evento, creo. :) –

+0

¡Pero 'cómo' es la pregunta !! No puede agregar controladores de eventos sin romper MVVM. La referencia de comando le permite convertir un evento en la interfaz de usuario a un comando en la máquina virtual. – NVM

0

¿Necesita controlar el evento CellEditEnding? ¿Sería una posibilidad ejecutar el código en el setter de la propiedad que está vinculada a la celda?

-1

"MVVM no permite el código detrás y así el manejo de eventos."

¡Vaya! Ahí está el problema.

MVVM desalienta el código que hay detrás, es cierto, pero solo cuando algo se puede hacer razonablemente a través de Xaml. "No codificarás detrás" nunca ha sido dicho por alguien con una pista.

A veces, el manejo de un evento es la forma más simple y mejor para lograr su objetivo. Cuando esa sea la situación, acéptala, resuelve tu problema y sigue adelante. A veces ni siquiera es posible lograr tu objetivo en XAML. En esos casos, arroje la lógica de vista en el código subyacente de la vista y continúe.

Es mucho más importante mantener los objetivos arquitectónicos de MVVM (separación de preocupaciones entre capas) que cumplir estrictamente las reglas generales (como evitar el código subyacente). Si esa distinción no se realiza , te estás perdiendo el bosque por los árboles.

+0

Bueno, tienes razón y estás equivocado. Si está agregando algún código detrás simplemente por hacer algo puramente de interfaz de usuario, está bien. Pero supongamos que si el evento final de edición de celda va a actualizar algo en su modelo (a través de su máquina virtual), entonces es una muy mala idea (IMO). – NVM

+0

Depende de qué tan adecuado sea su modelo para trabajar en un DataGrid. En una situación, tengo @work ahora, por ejemplo, me veo obligado a usar una cuadrícula de datos de una sola fila para representar un solo elemento.La VM no va a exponer una colección de estos elementos que solo pueden contener una sola instancia, sería una ridícula concesión en el lado de la VM por un extraño requerimiento en el V. Más bien, la V es responsable de la transformación lo que la VM expone como una aplicación real necesita lo que requiere. –

+0

No estoy seguro de entender cuál es su situación. Pero no estoy de acuerdo con la afirmación de que "la vista es responsable de transformar lo que la VM expone". The View es responsable de "mostrar" lo que expone la VM. La VM es responsable de transformar el modelo. Una vista solo debe solicitar a la máquina virtual que transforme las cosas en el modelo en función de la solicitud de los usuarios. La vista no tiene nada que ver con la transformación de nada en el modelo, es completamente responsabilidad de VM. Y la VM existe precisamente porque los modelos no se adaptan directamente a las vistas de trabajo (como datagridview). – NVM

0

Como nunca hubo una respuesta marcada para esta pregunta; lo que quiere es una implementación de "evento para mandar". Básicamente, captura un evento de su elección y llama a una implementación ICommand en su ViewModel.

Ya ha respondido here en resumen (compruebe la respuesta de Derek Beattie).

Cuestiones relacionadas