2012-04-02 14 views
1

Ich überschreibe ein Projekt in WPF mit Caliburn Framework. Ich kam aus C++ Welt, also habe einige Schwierigkeiten, selbst einfachste Dinge herauszufinden ...Caliburn MVVM WPF-Dialog mit OK-Aktion

Also, sagen wir, ich habe: MainView, MainViewModel, DialogView, DialogViewModel.

In MainView.xaml: ...

<MenuItem Name="Dialog" Header="Dialog"></MenuItem> 

... Caliburn begrenze es in MainViewModel ein Verfahren:

public void Dialog() 
     { 
      dynamic settings = new ExpandoObject(); 
      settings.WindowStartupLocation = WindowStartupLocation.Manual; 
      _windowManager.ShowWindow(new DialogViewModel(_windowManager), null, settings); 
     } 

Es funktioniert gut, Dialog erscheint.

nun in diesem Dialog die ich habe:

<TextBox Name="Dimension1"/> 
<TextBox Name="Dimension2"/> 

plus, andere Textfelder, Kontrollkästchen usw. Dann gibt es Schaltflächen OK und Abbrechen:

<Button Content="OK" Name="OK"></Button> 
<Button Content="Cancel" Name "Cancel"></Button> 

Jetzt, wie es jetzt ist Sie sind an OK() und Cancel() -Methoden in DialogViewModel gebunden und ich kann nicht herausfinden oder finden Sie Informationen, wie Sie mit ihnen in DialogViewModel umgehen.
fand ich ein Beispiel, wenn DialogResultsAction Klasse erstellt wird, ich meine OK gebunden ist, kann/Tasten in dieser Klasse mit den Methoden abbrechen, aber nicht verstehen kann, wie weiter verfahren ist ...

Können Sie mir raten welche Richtung Ich gehe?

+0

Haben Sie bei den Proben sehen, die mit Caliburn Mikro kommen? Wenn Sie kein Mikro verwenden, sollten Sie es sich ansehen. –

+0

Ich benutze Micro. Wird in Proben schauen. Kannst du einen bestimmten empfehlen? – user1298416

+0

Ich schaue in HelloWindowManager - wenn Benutzer auf bestimmte Schaltfläche im Dialogfeld klickt, übergibt es den Datenkontext der Schaltfläche an ViewModel.In meinem Fall habe ich etwa 20 Textfelder, Kontrollkästchen, Radiobuttons in einem Dialog, sollte ich sie alle als Parameter an ViewModel übergeben oder gibt es einen eleganteren Weg? – user1298416

Antwort

1

Ich bin mir nicht sicher, ob Sie das suchen, aber Sie können das DialogViewModel wie jeden anderen Bildschirm behandeln. In diesem Beispiel werden Ok und Cancel an die entsprechenden Methoden gebunden. Technisch könnten Sie x:Name="TryClose" für den Namen der Abbrechen-Schaltfläche festlegen, aber ich nannte es für dieses Beispiel Abbrechen.

In der Open-Methode in ShellViewModel können Sie Werte im Dialogfeld vor der Anzeige voreinstellen. Und nachdem das Ergebnis zurückgegeben wurde, da Sie einen Verweis darauf haben, können Sie diese Werte auch lesen.

Open-Methode in ShellViewModel:

public void Open() 
    { 
     var dialogViewModel = IoC.Get<DialogViewModel>(); 
     dialogViewModel.Dimension1 = "123"; 
     dialogViewModel.Dimension2 = "456"; 
     var result = WindowManager.ShowDialog(dialogViewModel); 
     if (dialogViewModel.MyDialogResult == DialogResult.OK) return; 

     //do stuff with results    
     var dim1 = dialogViewModel.Dimension1; 
    } 

DialogView:

<Grid> 
     <StackPanel> 
      <TextBlock x:Name="Dimension1" /> 
      <TextBlock x:Name="Dimension2" /> 
     </StackPanel> 
     <StackPanel Height="50" 
        Orientation="Horizontal"> 
      <Button x:Name="Ok" 
        Content="Ok" /> 
      <Button x:Name="Cancel" 
        Content="cancel" /> 
     </StackPanel> 
    </Grid> 

DialogViewmodel:

[Export(typeof (DialogViewModel))] 
    public class DialogViewModel : Screen 
    { 
     private string _dimension1; 
     public string Dimension1 
     { 
      get { return _dimension1; } 
      set 
      { 
       _dimension1 = value; 
       NotifyOfPropertyChange(() => Dimension1); 
      } 
     } 
     private string _dimension2; 
     public string Dimension2 
     { 
      get { return _dimension2; } 
      set 
      { 
       _dimension2 = value; 
       NotifyOfPropertyChange(() => Dimension2); 
      } 
     } 

     public void Ok() 
    { 
     //Do stuff 
     MyDialogResult = DialogResult.OK; 
     TryClose(); 
    } 

    public void Cancel() 
    { 
     MyDialogResult = DialogResult.Cancel; 
     TryClose();   
    } 
+0

Danke! Genau das habe ich gesucht. – user1298416

0

Wenn Ihr ViewModel auf IScreen basiert, verwenden Sie Close in der Ok- oder Cancel-Methode. Wenn Sie ein Ergebnis zurückgeben müssen, würde ich vorschlagen, den IEventAggregator zu verwenden, um das Ergebnis zurück an das übergeordnete Element zu übertragen. Wenn Sie wirklich brauchen, können Sie GetView() verwenden, um die mit dem Ansichtsmodell verknüpfte Ansicht zu erhalten, sie in den richtigen Typ zu konvertieren und das Ergebnis festzulegen (vorausgesetzt, die Ansicht hat ein Ergebnis, ich habe die Dialog-Klasse nicht verwendet) .

+0

Mein Modell basiert auf PropertyChangedBase, IShell, wobei IShell eine leere Schnittstelle ist (ich habe dieses Beispiel irgendwo gefunden). Wenn ich IScreen hinzufüge und dann Close() in meiner OK() Methode verwende - wie werde ich verschiedene Werte wie _dimension1, _dimension in MainViewModel aktualisiert haben? Ich lese mehr über IEventAggregator ... Können Sie Beispiele vorschlagen? Vielen Dank! – user1298416

+0

Bildschirm (oder IScreen) wird von PropertyChangedBase abgeleitet. Ich würde von Screen ableiten, da es viel mehr zur Verfügung stellt, noch müssten Sie alle von IScreen implementieren. –

+0

Vielen Dank für die Erklärung! – user1298416