none
MVVM Light Toolkit Aprire una nuova Window RRS feed

  • Domanda

  • Buon giorno a tutti volevo chiedervi se è giusto come ho fatto, ho seguito questa filosofia e ho fatto cosi ma non so se sia corretto:

    Nel ViewModel:

     public MainViewModel()
            {
                OpenParametriView = new RelayCommand(() => Messenger.Default.Send<OpenWindowMessage>(new OpenWindowMessage() { Type = WindowType.KParametri}));
                OpenBustaView = new RelayCommand(() => Messenger.Default.Send<OpenWindowMessage>(new OpenWindowMessage() { Type = WindowType.KBusta }));
    
                
            }
    
            public RelayCommand OpenParametriView { get; private set; }
            public RelayCommand OpenBustaView { get; private set; }

    Pero Poi sono costretto a mettere le mani nel Codebehind della View:

    public partial class MainWindow : Window
        {
            public MainWindow()
           {
                InitializeComponent();
    
                Closing += (s,e) => ViewModelLocator.Cleanup();
                Messenger.Default.Register<OpenWindowMessage>(
                  this,
                  message =>
                  {
                      if (message.Type == WindowType.KParametri)
                      {
                          var ParametriView = new ParametriView();
                          ParametriView.Show();
                      }
                      if (message.Type == WindowType.KBusta)
                      {
                          var bustaView = new Riparazioni.View.BustaView();
                          bustaView.Show();
                      }
    
                  });
          
      
    
    }

    Cosa ne pensate Rispetto il Pattern MVVM?


    Paolo

    mercoledì 17 dicembre 2014 09:46

Tutte le risposte

  • Ciao Paolo, non sei costretto a mettere mano al code-behind anche se questo non bisogna comunque considerla come eresia, ma si, nel tuo caso, dato che non è codice prettamente relativo alla "grafica" della window, ti consiglio di spostare semplicemente quel codice in una classe a parte, che utilizzerai semplicemente per gestire la messaggistica globale dell'applicazione, come aperture di nuove window, ecc...

    La MainWindow non farla creare da wpf attraverso XAML, in altre parole togli dall'App.xaml lo StartupUri, poi vai nel code-behind dell'app.xaml dove puoi creare un po' di codice di bootstrapping tra cui l'init dell'eventuale tuo ascoltatore di messaggi globale, e nonchè di mvvm light se lo necessita:

    using System.Windows;
    
    namespace WpfApplication2
    {
        /// <summary>
        /// Interaction logic for App.xaml
        /// </summary>
        public partial class App : Application
        {
            public App()
            {
                // bootstrapping stuff
                var messenger = new GlobalMessengerHooks();
                messenger.Register();
    
                var mainWindow = new MainWindow();
                mainWindow.DataContext = new object(); // tuo viewmodel qui
                mainWindow.Show();
            }
        }
    
        public class GlobalMessengerHooks
        {
            public void Register()
            {
                Messenger.Default.Register<OpenWindowMessage>(
                    this,
                    message =>
                    {
                        if (message.Type == WindowType.KParametri)
                        {
                            var ParametriView = new ParametriView();
                            ParametriView.Show();
                        }
                        if (message.Type == WindowType.KBusta)
                        {
                            var bustaView = new Riparazioni.View.BustaView();
                            bustaView.Show();
                        }
                    });
            }
        }
    }

    questo è assolutamente un concept e basta, quindi devi concretizzarlo con il tuo framework mvvm che hai scelto che non conosco bene, io utilizzo e sviluppo :) Radical che ha anche un motore di messaggistica interno che fa già queste cose, e sfrutta un IoC container per suddividere per bene le registrazioni dei messaggi globali.

    In questo modo come vedi sei completamente disaccoppiato.

    Se invece il messaggio fosse stato relativo a qualcosa che modificava l'interfaccia MainWindow, avresti dovuto semplicemente registrare il messaggio direttamente nel costruttore del ViewModel della MainWindows, il probabile MainViewModel.


    Michael Denny
    Microsoft MVP - Visual C#
    About Me

    • Proposto come risposta Paolo Pranzo sabato 20 dicembre 2014 13:16
    venerdì 19 dicembre 2014 12:20
  • Ciao Michael ho scelto di non seguire radical perchè essendo un'autodidatta, lo faccio più per passione NON PER LAVORO(non si sa mai nella vita) mi aiuto facendo domande nei forum soprattutto quelli in inglese anche se devo dire che ultimamente ricevo molti aiuti anche dal forum italiano, ma perché appunto con MVVM light Toolkit trovo più discussioni. Mi piacerebbe seguire anche Radical perchè se non erro è un progetto Italiano,ma non ho trovato tante discussioni o documentazione, correggimi se sbagio.Grazie Per il tuo aiuto.

    Paolo

    sabato 20 dicembre 2014 06:55
  • Si, Radical è un progetto italiano di Mauro Servienti a cui ho iniziato a partecipare attivamente anche io da quest'anno, e si, stiamo facendo il possibile per la documentazione ma non ce n'è tanta, la trovi su github, e un'altra parte direttamente su dei blog post di Mauro, e qualcosa anche da me, prova a vedere i due tutorial che avevo postato, dove in quello della UI composition avevo elencato anche una serie di cross-link al blog di Mauro.

    Se vuoi seguire il progetto Radical siamo su GitHub, che come piattaforma di open-source è stupenda, non per niente anche Microsoft alla fine si è decisa ad utilizzarla :) puoi farci una "STAR" sul progetto e seguire le evoluzioni, inoltre puoi anche collaborare con noi se ti va, aiutandoci con la wiki (completamente open), con il progetto stesso (attraverso pull request)


    Michael Denny
    Microsoft MVP - Visual C#
    About Me

    sabato 20 dicembre 2014 09:48