Diese Frage bezieht sich auf eine WPF-Anwendung, die auf PRISM 5.0 und dem MVVM-Muster basiert.MVVM-Entwurf: Blockieren von MessageBox in ViewModel
Manchmal, wenn Benutzer Entscheidungen treffen, die unerwünschte oder negative Konsequenzen haben können, ist es sehr üblich, den Benutzer zu fragen, ob er wirklich weitermachen und fortfahren möchte.
Zum Beispiel: Eine übliche Art und Weise, wird der Benutzer mit einem messagebox fragen, ob er wirklich Daten löschen will, das kann nicht nach dem Löschen wiederhergestellt werden.
Das Problem ist: Wenn ich die MessageBox innerhalb des Ansichtsmodell nennen, das Ansichtsmodell wird untestable von außen.
//BAD!
public class ViewModel
{
public Boolean Delete()
{
//Blocking and therefore untestable in automatic UnitTests
MsgBoxResult result = MsgBox.Show("Do you really want to delete?");
if (result == yes) {//Do stuff that deletes data here;}
}
}
Eine Möglichkeit wäre, die Frage in einer anderen privaten Methode zu stellen, dass die Öffentlichkeit Methode
//BETTER, BUT OK?
public class ViewModel
{
private void OnDeleteAction
{
MsgBoxResult result = MsgBox.Show("Do you really want to delete?");
if (result == yes) {Delete();}
}
public Boolean Delete()
{
//Testable from the outside again, because no blocking question
//Do stuff that deletes data here
}
Meine Frage stellt: Ist dies ist ein guter Weg, oder gibt es eine elegante Möglichkeit, den Benutzer in einem ViewModel zu fragen? Können Sie mir einen Hinweis oder Link geben, was ist das Beste für PRISM 5.0?
Ich weiß, dass eine Faustregel ist, keine UI-Elemente im ViewModel zu verwenden, aber ich sehe keine Alternative zu einer blockierenden MessageBox oder etwas anderem, das den Prozess blockiert, bevor Sie fortfahren.
Vielen Dank für Hinweise!
Gemäß meinem Verständnis sollte man jede nicht schreiben verwandten Code im View-Modell und Logik-bezogenen Code in der Ansichtsseite anzeigen. So können Sie das Meldungsfeld im Ansichtscode hinter und auf der Grundlage der Benutzerauswahl öffnen, die Sie in der Sichtmodellklasse Ihre Löschmethode aufgerufen haben. –
'öffentliche Schnittstelle MuhMessageBox {bool AreYouCrazy (Zeichenfolge Nachricht); } ' – Will