2009-07-08 8 views
0

Ich habe gerade eine "Dialogbox-Lösung" für meine WPF/MVVM Anwendung, in der das ViewModel seine ViewModel-Eigenschaften geändert, und die Ansicht verwendet Trigger, um die Dialogbox usw. anzuzeigen und auszublenden, etc. Von einem UX Erfahrung ist zufriedenstellend.Kann ich jetzt eine View dazu bringen, eine andere View zu instanziieren, die darüber wie eine DialogueBox erscheint?

Doch die „Dialog“, die ich benutze, ist ein Border Element, das seine Sichtbarkeit Eigenschaft Visible und Komprimiert wird umgeschaltet zwischen, so dass es nicht wirklich „Pop-up“, sondern nur eine Art von "springt" in die Anwendung ein.

So Ich möchte, dass meine Lösung so dass das Dialogfeld tatsächlich erscheint wie ein klassisches MessageBox erweitern.

Zur Zeit habe ich dies:

<Style x:Key="DialogueBoxDelete" TargetType="Border"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding DialogueBoxDeleteStatus}" Value="show"> 
      <Setter Property="Border.Visibility" Value="Visible"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding DialogueBoxDeleteStatus}" Value="hide"> 
      <Setter Property="Border.Visibility" Value="Collapsed"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

Da ich verstehe, dass es für die Testbarkeit von MVVM wichtig ist, dass mein Viewmodel nicht meine DialogueBox Ansicht nicht instanziiert aber, dass meine Ansicht instanziiert die DialogueBox Ansicht, ich bin denken ich so etwas wie dieses brauchen würde:

PSEUDO-CODE:

<Style x:Key="DialogueBoxDelete" TargetType="Border"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding DialogueBoxDeleteStatus}" Value="show"> 
      <InstantiateDialogueWindow .../> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding DialogueBoxDeleteStatus}" Value="hide"> 
      <RemoveWindow.../> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

Aber was ist die Syntax dafür? Wie kann mein UserControl ein anderes Fenster instanziieren, das über der aktuellen Anwendung schwebt?

Antwort

1

Einfach in Code-hinter. Tun Sie einfach new Window(), stellen Sie die Eigenschaften Content und Owner ein und rufen Sie Show() an.

Wenn Sie nach einer Möglichkeit suchen, es in XAML zu tun, bin ich mir nicht sicher, ob es eine gibt. Ich weiß, dass Sie ein <Window> Element als einen XAML-Kindknoten nicht einbetten können (ich habe es versucht). Sie können das Steuerelement Popup betrachten, aber das ist nicht ideal, weil es keine Titelleiste, Größenänderung von Rahmen usw. haben wird. Es wird in der Lage sein, außerhalb der Grenzen Ihres Fensters zu erweitern, aber ansonsten wird es nicht besser sein als Ihr Rahmen . Es wird nicht wie ein Dialogfeld aussehen.

Aber ehrlich gesagt, ich bin mir nicht sicher, ob ich das aus der Sicht tun würde. Sie sollten erwägen, das ViewModel (das schließlich über die gesamte Anzeigelogik verfügt) zu entscheiden, wann und wie mehr GUI angezeigt werden soll. Unter this question erfahren Sie, wie Sie die GUI vom ViewModel aus anzeigen können (ohne das ViewModel vom View-Code abhängig zu machen).

+0

Werfen Sie einen Blick auf MVVM Toolkit Light von Laurent Bugnion, er implementiert in seiner Visual Studio Vorlage ein Dialogue Fenster, wie Sie hier in Code-Behind mit einem Messaging-Service beschreiben: http://www.galasoft.ch/mvvm/getstarted –

+0

Aber ist es immer noch testbar, wenn hier hinter dem Code Code steckt? –

+0

Deshalb würde ich es lieber in das ViewModel einfügen (siehe meinen letzten Absatz). Dann ist es * Unit-Testable. –

Verwandte Themen