2017-07-30 3 views
1

Als ich gefragt wurde, wie ein Dialog in MVVM mir jemand zu implementieren empfohlen, diesen Thread zu lesen:MessageBox wird nicht in MVVM-Anwendungen empfohlen?

var dialog = new DialogViewmodel(); 
var result = _dialogservice.ShowDialog("My Dialog", dialog); 

if(result.HasValue && result.Value) 
{ 
    //accept true 
} 
else 
{ 
    //Cancel or false 
} 

:

MVVM, DialogService and Dialog Result

Nach Ansicht Modell wird der Dialog auf diese Weise aufgerufen Aber ist das anders als eine messageBox auf diese Weise?

In diesem zweiten Fall verwende ich MessageBox anstelle des benutzerdefinierten Dialogfelds, sodass ich keinen Unterschied sehe.

Wie auch immer, in vielen Fällen habe ich gelesen, dass eine MessageBox in MVVM-Anwendung eine schlechte Idee ist, weil es das MVVM-Muster bricht. Aber wenn das wahr ist, sehe ich nicht, wie die erste Lösung das MVVM-Muster nicht bricht und das zweite bricht es.

+0

Jede Messagebox ist ein U/X-Designfehler, da sie den Benutzer unterbricht. –

+0

Aber in MVVM und Software Architecture Kontext, versuchen Sie es in Bezug auf Abhängigkeiten und Testbarkeit zu betrachten. Eine VM, die MessagBox direkt aufruft, ist viel schwieriger zu testen. –

+0

Warum erstellen Sie nicht einfach einen 'IAlertService', um' MessageBox' genau so zu behandeln wie bei Dialogen? – MickyD

Antwort

3

Die Grundidee des MVVM-Musters ist die Trennung von Bedenken. Das Ansichtsmodell sollte nicht wissen, wie es mit einem Dialog umgehen soll. Warum? Hier einige Gründe dafür sind:

  • Ihre Ansicht Modell Versuch: Keine Dialoge sind erwünscht (Stellen Sie sich vor Sie brauchen Dialoge klicken die ganze Zeit)
  • eine Konsolenanwendung einer GUI-Anwendung erstellen (Die Dialoge sollten in der Konsole angezeigt werden nicht als Pop-up-Boxen)
  • Es ist erforderlich, das Design Ihrer Dialoge zu ändern (Stellen Sie sich alle MessageBox Anrufe)
  • ...

Lösung ändern müssen: Verwenden der Abhängigkeitsinjektion durch Implementieren einer gut definierten Schnittstelle für Dialoge. Sie können ein sehr gutes und grundlegendes Beispiel in this answer finden.

Ergebnis: Aufruf _dialogservice.ShowDialog ist vielleicht nur einen Wrapper von MessageBox.Show sondern könnte auch ein etwas Dialog in einer Konsole in einer Konsolenanwendung oder Debug-Protokoll während der Prüfung sein. Der Code ist also gut von jeder Präsentation getrennt.

+0

OP benötigt nur das Äquivalent zu "IAlertService" gemäß seinem Dialogservice. Ob es von DI zur Verfügung gestellt wird, ist weder hier noch dort – MickyD

Verwandte Themen