2009-08-26 25 views
9

Ho un'applicazione WPF che sto cercando di scrivere nello stile MVVM. Se viene lanciata un'eccezione (come quando viene aperto un documento), vorrei visualizzare un MessageBox. Facile da fare, ma il mio codice non sembra giusto perché la chiamata MessageBox.Show è in ModelView. Ho pensato che quel genere di cose dovrebbe vivere nella View, ma non dovrei inserire il codice nella View.Gestione delle eccezioni MVVM

Quindi la domanda può essere distillata fino a qual è il modo consigliato di visualizzare un MessageBox in MVVM?

risposta

16

Usa un servizio:

public void SomeMethodInYourViewModel() 
{ 
    try 
    { 
     DoSomethingDangerous(); 
    } 
    catch (Exception ex) 
    { 
     ServiceLocator.Resolve<IMessageService>().ShowMessage(ex.Message); 
    } 
} 

Hai ora disaccoppiato le macchine virtuali dalla presentazione di messaggi. Potresti persino decidere di non utilizzare affatto le caselle di messaggio standard (brutte) e ciò non influirà sulle tue VM.

+1

+1: Inoltre, un'alternativa all'utilizzo di ServiceLocator consiste nell'utilizzare Dependency Injection per iniettare IMessageService nelle VM in base alle necessità. –

+0

A causa del disaccoppiamento dal livello di presentazione, è possibile testare il proprio ViewModel. – jbe

9

Dai un'occhiata all'ottima MVVM Foundation di Josh Smith su Codeplex. In particolare, dai un'occhiata alla classe Messenger, un modo leggero per passare messaggi tra vari oggetti ViewModel che non devono essere consapevoli l'uno dell'altro.

Inoltre, non credo che ci sia una regola hard-and-fast su "Nessun codice nella vista", anche se è meglio essere evitato se possibile ... ricorda che il tuo XAML è semplicemente il codice .net scritto in una sintassi dichiarativa; il code-behind è solo C# o VB.net per completarlo (se assolutamente necessario!)

+0

+1 per il bit sull'ignoranza della regola "no code in view". È più di una linea guida comunque. :) –

2

Si potrebbe anche solo mettere una proprietà stringa ErrorMessage sulla classe ViewModel a cui può associare la vista.