none
MVVM y msgbox (o cualquier otro diálogo modal) RRS feed

  • 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

    jueves, 30 de agosto de 2012 12:30

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
    viernes, 31 de agosto de 2012 13:03

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

    jueves, 30 de agosto de 2012 19:30
  • 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
    viernes, 31 de agosto de 2012 7:24
  • 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

    viernes, 31 de agosto de 2012 12:25
  • 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

    viernes, 31 de agosto de 2012 12:33
  • 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
    viernes, 31 de agosto de 2012 13:03
  • Esto ya es otra cosa, es tan sencillo que hasta yo lo entiendo jeje Muchas gracias, Leandro, ahora no me da tiempo, pero el lunes me lo miro a fondo y te digo si ya lo he conseguido solucionar.

    ¡¡¡ Gracias de nuevo !!!


    Carlos Adrián Martínez

    viernes, 31 de agosto de 2012 13:07
  • 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

    martes, 4 de septiembre de 2012 14:48