Principales respuestas
MVVM y msgbox (o cualquier otro diálogo modal)

Pregunta
-
Buenos días:
Poco a poco voy mejorando mis conocimientos de WPF y ya he conseguido hacer bastantes cosas con mi aplicación de prueba. Pero supongo que he llegado al punto al que todo programador novato de WPF llega: ¿cómo muestro un msgbox sin romper el patrón MVVM?
Algo tan sencillo como pulsar un botón de "Borrar" y que el programa pregunte "¿Está seguro que desea borrar?", se me complica muchísimo.
He mirado por internet y en el foro y no encuentro ninguna manera "fácil" de conseguir esto. ¿Alguien me puede ayudar? Ya sé que explicarlo será complicado, pero si alguien conoce algún artículo, algún foro, algún blog, o donde sea que pueda orientarme un poco, le estaría muy agradecido.
¿O es que es obligatorio hacerlo desde el code-behind? Porque en el ejemplo de "¿Está seguro que desea borrar?" no tendría mucha importancia, pero en otros muchos sí que sería un fastidio tener que hacerlo desde la vista.
Muchas gracias
Carlos Adrián Martínez
Respuestas
-
con que implementes una clase con la cual puedas crear un mock para abstraer el uso del messagebox es suficiente
aqui
http://refactorthis.wordpress.com/2010/11/24/mvvm-tips-how-to-show-a-message-box-or-dialog-in-mvvm-silverlight/
lo hacen mucho mas simple, como veras una interfaz que encapsula el messagebox
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Marcado como respuesta Carlos Adrián viernes, 7 de septiembre de 2012 11:46
Todas las respuestas
-
analiza este articulo
Using a Service Locator to Work with MessageBoxes in an MVVM Application
veras que termina usando el MessageBox.Show() pero lo ahce por medio de un servicelocator para poder aplicar mock y testear el viewmodel, sin que este interfiera
el punto principal esta cuando haces
var msgBox = base.GetService<IMessageBoxService>();
y la implementacion en el titulo "Run-time"
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
Buenos días:
Muchas gracias por tu respuesta, Leandro, pero lamento comunicarte que sigo teniendo muchas dudas sobre este tema. Entre que Josh Smith es demasiado técnico, un nivel de programación demasiado elevado para mí, que está en inglés y que programa en C#, el caso es que lo leo y me pierdo mucho.
Además, en ese artículo se centra sobre todo en las pruebas unitarias, mientras que a mí, inicialmente, ese aspecto me preocupa menos. Lo que me interesa es aprender cómo mostrar cuadros de diálogo sin fastidiar el patrón MVVM.
Me gustaría hacer tres preguntas:
1) Si yo directamente desde el ViewModel hago un MessageBox.Show(), ¿el único problema que hay es con las pruebas unitarias?
2) ¿Conocéis algún ejemplo, lo más sencillo posible, de esto en VB?
3) ¿Es imprescindible, o altamente recomendable al menos, usar una librería tipo MVVM Light Toolkit o PRISM para poder trabajar con MVVM? Yo hasta ahora no la he usado, pero quizás la necesite para poder hacer MessageBox. Si es imprescindible, ¿cuál recomendaríais para alguien que no tiene aun muchos conocimientos?
Muchísimas gracias a todos y a ti en especial, Leandro.
Carlos Adrián Martínez
- Editado Carlos Adrián viernes, 31 de agosto de 2012 9:30 Ampliación
-
1) Si yo directamente desde el ViewModel hago un MessageBox.Show(), ¿el único problema que hay es con las pruebas unitarias?
exacto el tema de usar todo ese codigo con servicio es de poder crear un mock y emular un mensaje cuando estes eejcutando los test
si los test no te interesan entocnes puede usar directo el messagebox, aunque si estas aplicando un patron se supone que hagas usos de las buenas practicas, sino directamente ubieras codificado en el codebehind del window y listo con eventos y demas
para que tanto mvvm si no vas a aplicar test
Leandro Tuttini
Blog
Buenos Aires
Argentina -
Sí, mi intención era hacer uso de las buenas prácticas. Yo vengo de VB6 y me está costando un mundo entrar en el .NET, y quería hacerlo lo mejor posible para luego en el futuro, según vaya ampliando mis conocimientos tener el código lo mejor hecho posible. Me costó un poco montar el MVVM, pero lo conseguí y estoy contento con ello, me he atrancado un par de vez y he conseguido sacarlo adelante, siempre siguiendo el patrón (quizá más a rajatabla incluso de lo que es necesario, sin nada de code-behind, de momento), etc. Pero en este caso es soy completamente incapaz de conseguir hacerlo bien, por eso preguntaba, por si a la desesperada puedo hacerlo "mal".
Evidentemente no es lo que me gustaría, pero es que estoy muy atascado y no consigo hacerlo como explica Josh Smith.
De todas formas, muchas gracias por tu ayuda, es genial tener esta ayuda de programadores expertos cuando uno se está iniciando.
Carlos Adrián Martínez
-
con que implementes una clase con la cual puedas crear un mock para abstraer el uso del messagebox es suficiente
aqui
http://refactorthis.wordpress.com/2010/11/24/mvvm-tips-how-to-show-a-message-box-or-dialog-in-mvvm-silverlight/
lo hacen mucho mas simple, como veras una interfaz que encapsula el messagebox
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Marcado como respuesta Carlos Adrián viernes, 7 de septiembre de 2012 11:46
-
-
Hola Leandro:
Llevo dos días con esto y tengo un pequeño problema. Esta parte del código no encuentro ningún traductor que me la pase a VB, en todos da error.
public interface IMsgBoxService { ShowNotification(string message); bool AskForConfirmation(string message); //... etc }
El resto del código sí me lo traducen todos los traductores, pero ese trozo no, y no tengo ni idea de por qué puede ser.
Aparte de eso, tengo también dudas de dónde debo poner ese código. ¿Es recomendable ponerlo en todos los ViewModel o es mejor llevarlo a ViewModelBase? En el artículo que me pasaste hay dos partes de código y la segunda, que es el equivalente al MessageBox.Show, entiendo que va en el código del ViewModel, dónde queramos hacer la llamada al MessageBox, pero la primera parte, donde define la interface y la clase
MsgBoxService
, no tengo claro dónde debería ir.¿Me podrías ayudar, por favor?
Muchas gracias por tu paciencia conmigo.
Carlos Adrián Martínez