Es gibt zwei gute Möglichkeiten, dies zu tun: 1) einen Dialogdienst (einfach, sauber) und 2) eine unterstützte Ansicht. View Assisted bietet einige nette Funktionen, ist es aber normalerweise nicht wert.
DIALOG-SERVICE
a) eine Dialogdienstschnittstelle wie über einen Konstruktor oder einen Abhängigkeitscontainer:
interface IDialogService
{
Task ShowDialogAsync(DialogViewModel dlgVm);
}
b) Ihre Implementierung von IDialogService sollte ein Fenster öffnen (oder ein Steuerelement in das aktive Fenster einfügen), eine Ansicht erstellen, die dem Namen des angegebenen dlgVm-Typs entspricht (verwenden Sie die Containerregistrierung oder -konvention oder einen ContentPresenter mit typassoziierten DataTemplates). ShowDialogAsync sollte eine TaskCompletionSource erstellen und ihre .Task-Proptery zurückgeben. Die DialogViewModel-Klasse selbst benötigt ein Ereignis, das Sie in der abgeleiteten Klasse aufrufen können, wenn Sie schließen möchten, und in der Dialogansicht beobachten können, um den Dialog tatsächlich zu schließen / auszublenden und die TaskCompletionSource abzuschließen.
b) Rufen Sie zur Verwendung einfach await this.DialogService.ShowDialog (myDlgVm) auf Ihrer Instanz einer von DialogViewModel abgeleiteten Klasse auf. Überprüfen Sie nach dem Warten auf die Rückkehr die Eigenschaften, die Sie Ihrer Dialog-VM hinzugefügt haben, um festzustellen, was passiert ist. Sie brauchen nicht einmal einen Rückruf.
ANSICHT UNTERSTÜTZT
Dadurch hört Ihre Ansicht ein Ereignis im Ansichtsmodell ab. Dies alles könnte in ein Mischverhalten eingepackt werden, um Code-Behind und Ressourcennutzung zu vermeiden, wenn Sie dazu neigen (FMI, Unterklasse "Behavior", um eine Art Blendable-angehängte Eigenschaft für Steroide anzuzeigen). Im Moment machen wir das manuell in jeder Ansicht:
a) Erstellen Sie ein OpenXXXXXDialogEvent mit einer benutzerdefinierten Nutzlast (einer von DialogViewModel abgeleiteten Klasse).
b) Lassen Sie die Ansicht das Ereignis in ihrem OnDataContextChanged-Ereignis abonnieren. Stellen Sie sicher, dass Sie den alten Wert! = Null und im Ereignis Unloaded des Fensters ausblenden und abbestellen.
c) Wenn das Ereignis ausgelöst wird, lassen Sie die Ansicht Ihre Ansicht öffnen, die sich möglicherweise in einer Ressource auf Ihrer Seite befindet, oder Sie können sie gemäß Konvention an anderer Stelle suchen (wie im Dialogdienstansatz).
Dieser Ansatz ist flexibler, erfordert jedoch mehr Arbeit. Ich benutze es nicht viel. Der einzige schöne Vorteil ist die Möglichkeit, die Ansicht beispielsweise physisch in einem Tab zu platzieren. Ich habe einen Algorithmus verwendet, um ihn in die Grenzen des aktuellen Benutzersteuerelements zu setzen, oder wenn er nicht groß genug ist, den visuellen Baum zu durchlaufen, bis ein ausreichend großer Container gefunden wurde.
Auf diese Weise können sich Dialoge in der Nähe des Ortes befinden, an dem sie tatsächlich verwendet werden, nur den Teil der App dimmen, der sich auf die aktuelle Aktivität bezieht, und der Benutzer kann sich innerhalb der App bewegen, ohne die Dialoge manuell wegschieben zu müssen, selbst wenn mehrere Quasi vorhanden sind. Modale Dialoge werden auf verschiedenen Registerkarten oder Unteransichten geöffnet.