2012-03-04 8 views
6

Sto creando una semplice applicazione WPF. Ho una funzione OpenFile:Devo inserire questa funzione in Visualizza (code-behind) o in ViewModel?

private void OpenFile(string fileName) 
{ 
    if(!File.Exists(Helper.GetPath(fileName))) 
    { 
     MessageBox.Show("Error opening file"); 
    } 
    else 
    { 
     //Code to handle file opening 
    } 
} 

Idealmente dove dovrebbe essere presente questa funzione? Sento che dovrebbe essere in .xaml.cs perché accede a un MessageBox che entra nella parte View. Ma chiama anche il mio Helper, che è nel modello. Quindi penso anche che possa essere nel ViewModel. Qual è il vantaggio di avere questo nel View o nel ViewModel? Qualcuno può aiutarmi con alcuni suggerimenti?

Grazie.

risposta

7

Uno dei vantaggi di posizionarlo nel modello di visualizzazione sarebbe la testabilità. È possibile scrivere un test unitario per verificare che la finestra di messaggio venga visualizzata solo se il file esiste ad esempio (più precisamente sarebbe un test di integrazione se si sta colpendo il file system).

Tuttavia, poiché si utilizza direttamente una finestra di messaggio, il test non verrà mai completato su un server di generazione perché la macchina attende l'input dell'utente mentre viene visualizzata la finestra di messaggio.

Pertanto, vorrei lavorare contro un'astrazione nel modello di visualizzazione, in modo da poter eseguire mock the message box durante i test.

7

Questa funzione deve essere nel ViewModel. È necessario creare un'operazione nella visualizzazione per mostrare il messaggio di errore e chiamare questo metodo anziché MessageBox.Show. La finestra di messaggio deve essere visualizzata nello View.

In genere è necessario evitare l'implementazione di qualsiasi logica di business all'interno di View come la convalida o la gestione di un file.

2

Se stai usando Microsoft Prism è possibile utilizzare l'interfaccia IInteractionRequest di avere la vista a creare il MessageBox, ma in realtà passare di nuovo la risposta necessaria al-modello di vista.

Se si è non utilizzando Microsoft Prism, quindi osservare come funziona questa parte e simularla o utilizzare un framework che faccia qualcosa di simile.


In sostanza, che il codice dovrebbe andare sulla vostra visione a modello per la testabilità, ma sostituire la riga in cui si chiama in modo esplicito il MessageBox e utilizzare il IInteractionRequest menzionato invece.

Ecco la documentazione pertinente allo scenario che desideri implementare: Chapter 6: Advanced MVVM Scenarios. Guardare la sezione indicata Pattern di interazione utente.

Problemi correlati