2012-03-29 11 views
1

Ich entwickle eine .NET 4.0-Anwendung mit PRISM und MVVM sowie WPF.Anzeigen von modalen Dialogen mit PRISM 4

Ich habe derzeit eine Shell in Regionen unterteilt, mit Ansichten in ihnen eingefügt. Wenn der Benutzer auf eine Schaltfläche in einer der Ansichten klickt, möchte ich, dass ein benutzerdefinierter modaler Dialog über allen Ansichten angezeigt wird, aber immer noch in derselben Shell.

Ich betrachtete das Beispiel von StockTrader RI und ihre Implementierung des RegionPopupBehavior. Im Grunde haben sie eine Abhängigkeitseigenschaft erstellt, die es ihnen ermöglicht, Regionen mit einem spezifischen, benutzerdefinierten Verhalten zu definieren. Das Verhalten ist derjenige, der für die Verarbeitung des Renderings der verknüpften Ansicht verantwortlich ist und daher als ein Popup-Fenster angezeigt wird.

Der einzige Nachteil dieses Ansatzes ist, dass alle anderen Ansichten noch aktiv sind, also ist das Popup nicht modal. Ich denke, das kann gelöst werden, indem manuell alle nicht benötigten Bereiche in der Shell deaktiviert werden, aber ich bin mir nicht sicher, wie "sauber" das ist.

Ich frage mich, ob es einen besseren und einfacheren Ansatz zum Anzeigen von modalen Popup-Ansichten in Prism gibt?

+0

Dies ist WPF, nicht Silverlight, nicht wahr? –

+0

Korrekt, WPF. Ich habe die Frage bearbeitet, danke. :) –

+1

Vielleicht könnten Sie so etwas verwenden http://stackoverflow.com/questions/8103743/wpf-c-sharp-inputbox/8103869#8103869? Ich benutze dies mit einer modifizierten Version für MVVM, um das Gleiche zu tun. – eandersson

Antwort

2

Sie könnten an einer benutzerdefinierten interessiert sein PopupUserControl Ich habe auf meinem Blog, der sich so verhält.

Normalerweise verwende ich es so:

<local:PopupPanel 
    Content="{Binding PopupContent}" 
    local:PopupPanel.PopupParent="{Binding ElementName=SomeParentPanel}" 
    local:PopupPanel.IsPopupVisible="{Binding IsPopupVisible}"> 

    <local:PopupPanel.Resources> 
     <DataTemplate DataType="{x:Type local:SomeViewModel}"> 
      <local:SomeView /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type local:DifferentViewModel}"> 
      <local:DifferentView /> 
     </DataTemplate> 
    </local:PopupPanel.Resources> 

</local:PopupPanel> 

Obwohl Sie auch den Inhalt im Popup nur schreiben können stattdessen die Content-Eigenschaft der Bindung

<local:PopupPanel 
    local:PopupPanel.PopupParent="{Binding ElementName=SomeParentPanel}" 
    local:PopupPanel.IsPopupVisible="{Binding IsPopupVisible}"> 

    <Border BorderBrush="Blue" BorderThickness="2"> 
     <local:MyUserControl /> 
    </Border> 
</local:PopupPanel> 
+0

Danke! Sie haben Recht damit, dass ein ViewModel kein UI-Element enthalten sollte. Ich denke, die beste Lösung ist, wie Sie vorgeschlagen haben: an ein Objekt binden und Datenvorlagen haben ... –