2016-11-29 4 views
0

Ich habe ein Problem mit Caliburn.Micro: Ich habe ShellView.xaml und ShellViewModel.cs und ich möchte neues Dialogfenster 'NewDialogView öffnen. Xaml 'aus dem ShellViewModel.Caliburn.Micro: öffne neues Fenster vom Hauptfenster und verbinde es dann mit dem viewmodel

<StackPanel> 
    <Button x:Name="Click" 
      Content="Click" 
      /> 
</StackPanel> 

internal class ShellViewModel 
{ 
    public void Click() 
    { 
     Window newDialogView = new NewDialogView(); 
     newDialogView.Show(); 
    } 
} 

Dann, wenn ein Benutzer in diesem neuen Fenster ist, kann er/sie auf der Schaltfläche klicken und eine Nachricht erhalten:

<StackPanel> 
    <Button x:Name="ShowMessage" 
      Content="Click" 
      /> 
</StackPanel> 

internal class NewDialogViewModel 
{ 
    public void ShowMessage() 
    { 
     MessageBox.Show("Hello!"); 
    } 
} 

Das Problem ist, dass, wenn Ein Benutzer klickt auf die Schaltfläche in NewDialogView.xaml passiert nichts. Es gibt keine Nachrichtenbox mit dem Inhalt 'Hallo'. Bitte helfen Sie!

+3

Referenz WindowManager – mvermef

+0

Ich fand es heraus. Vielen Dank. – Navuhodonosor

Antwort

1

Nur um zu erweitern, was @mvermef in einem Kommentar oben gesagt hat.

Sie müssen den Fenstermanager von Caliburn Micro verwenden, um Ihren Dialog anzuzeigen. Caliburn wird dann in der Lage sein, alle Installationsarbeiten im Hintergrund durchzuführen. Normalerweise würden Sie den Caliburn-Bootstrapper verwenden, um den ShellViewModel mit dem Fenstermanager zu erstellen.

internal class ShellViewModel 
{ 
    public ShellViewModel(IWindowManager theWindowManager) 
    { 
     this.windowManager = theWindowManager; 
    } 

    public void Click() 
    { 
     // Assumes that there is a NewDialogView... 
     var newDialogViewModel = new NewDialogViewModel(); 
     bool? result = this.windowManager.ShowDialog(newDialogViewModel); 
     // result is true if user pressed ok button... 
    } 
} 
+0

Aber 'WindowManager.ShowDialog()' gibt einen nullbaren Booleschen Wert (nullabool? Hehe) zurück. Was ich mache, wenn ich wirklich einen booleschen Wert haben möchte: 'bool result = this.windowManager.ShowDialog (newDialogViewModel) ?? falsch; '. – Doom5

+1

@ Doom5 'result.GetValueOrDefault()' erreicht etwas ähnliches, aber IMHO ein bisschen aufgeräumter. Habe die Ergebnisdeklaration behoben. –

+0

Schön. Es ist tatsächlich aufgeräumter. – Doom5

Verwandte Themen