2013-10-22 8 views
7

Mein Programm besteht aus einem TreeView und zwei contentPresenters auf Bodenhöhe. Das mainWindow, TreeView und jedes contentPresenter haben alle ihre eigenen ViewModels.So rufen Sie Funktionen in einem Hauptansichtsmodell aus anderen Ansichtsmodellen auf?

Ich möchte eine Funktion in der mainWindowViewModel von TreeViewViewModel aufrufen.

Ich brauche das, weil die mainWindowViewModel Kontrollen zu tun, was in der contentPresenters angezeigt wird, und ich möchte die Anzeige manuell aktualisieren.

Ich vermute, ich würde so etwas tun ...

TreeViewViewModel:

public class TreeViewViewModel 
{ 
    //Do I need to declare the MainWindowVM? 

    public TreeViewViewModel() { ... } 

    private void function() 
    { 
      //Command that affects display 

      //Manually call function in MainWindowVM to refresh View 
    } 
} 

Ich habe versucht, aus den TreeViewViewModel Zugang zum MainWindowVM zu erhalten, indem mit:

public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } } 

Aber es macht nicht viel Sinn. weil die MWVM nicht die DataContext der TreeViewViewModel ist.

Antwort

10

Die in dieser und der verknüpften Antwort verwendete Methode delegate kann in jeder Eltern-Kind-Beziehung und in jeder Richtung verwendet werden. Das umfasst von einem Kindsichtmodell zu einem Elternsichtmodell, einem Window Code hinter dem Code hinter einem Kind Window, oder sogar reinen Datenbeziehungen ohne jegliche UI. Sie können mehr über das Verwenden von delegate Objekten von der Delegates (C# Programming Guide)-Seite auf MSDN herausfinden.

Ich habe gerade eine ähnliche Frage heute früher beantwortet. Wenn Sie sich den Beitrag Passing parameters between viewmodels ansehen, sehen Sie, dass die Antwort die Verwendung von delegate Objekten beinhaltet. Sie können diese delegate s (aus der Antwort) einfach durch Ihre Methode (n) ersetzen und es wird auf die gleiche Weise funktionieren.

Bitte lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben.


UPDATE >>>

Ja, sorry ich vergessen haben, ganz Methoden wollte stattdessen nennen ... Ich habe heute Abend auch gearbeitet viele Beiträge. So immer noch mit dem Beispiel aus der anderen Post einfach Ihre Methode in den ParameterViewModel_OnParameterChange Handler aufrufen:

public void ParameterViewModel_OnParameterChange(string parameter) 
{ 
    // Call your method here 
} 

Denken Sie an den delegate als Ihren Weg zurück zu dem übergeordneten Ansicht Modell ist ... es ist wie ein Ereignis auslöst genannt ReadyForYouToCallMethodNow. In der Tat brauchen Sie nicht einmal einen Eingabeparameter.

public delegate void ReadyForUpdate(); 

public ReadyForUpdate OnReadyForUpdate { get; set; } 

dann in der übergeordneten Ansicht Modell (nach dem Anbringen der Handler wie in dem anderen Beispiel):

public void ChildViewModel_OnReadyForUpdate() 
{ 
    // Call your method here 
    UpdateDisplay(); 
} 

Wie Sie mehrere untergeordnete Ansicht Modelle haben, Sie könnten Sie könnten Ihre delegate wie folgt definieren Definieren Sie die delegate in einer anderen Klasse, auf die beide Zugriff haben. Lass es mich wissen, wenn du weitere Fragen hast.


UPDATE 2 >>>

Nachdem wieder Ihren letzten Kommentar zu lesen, habe ich nur gedacht, eine viel einfachere Methode, die könnte erreichen, was Sie wollen ... zumindest, wenn ich verstehe, Sie richtig. Es ist möglich für Sie, Bind direkt von Ihren untergeordneten Ansichten zu Ihrem übergeordneten Ansichtsmodell. Zum Beispiel diese würden Sie Bind eine Button.Command Eigenschaft bei einem Kind im Hinblick auf eine ICommand Eigenschaft in Ihrem übergeordneten Ansicht Modell erlauben:

In TreeViewView:

<Button Content="Click Me" Command="{Binding DataContext.ParentCommand, 
RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" /> 

Dies setzt natürlich voraus, dass eine Instanz der Eltern Ansichtsmodell in Frage wird als DataContext der MainWindow festgelegt.

+0

Die einzige Sache über diese Antwort, die anders als das, was ich tue, ist, dass mainWindowViewModel ist das übergeordnete ViewModel, das ist, was ich versuche, anzurufen. Wie ändert sich diese Lösung? –

+0

Wenn Sie das Beispiel aus dem anderen Post verwenden, haben Sie eine Handler-Methode 'ParameterViewModel_OnParameterChange' in Ihrer' MainWindowViewModel'-Klasse. Der einzige Unterschied besteht darin, dass Ihr Update in diesem Handler bereits dort ist, wo Sie es haben möchten (im übergeordneten Ansichtsmodell), so dass Sie diesen Parameter nicht an das andere untergeordnete Ansichtsmodell übergeben müssen Verwenden Sie dasselbe Beispiel, führen Sie jedoch den gewünschten Wert mit dem Wert im Handler 'ParameterViewModel_OnParameterChange' aus, anstatt ihn an das andere Ansichtsmodell zu übergeben. – Sheridan

+0

Es scheint sich dabei um das Übergeben von Werten an andere ViewModels und das Ändern von Parameterwerten zu handeln. Ich möchte nur eine Funktion in 'mainWindowViewModel' von einer' Command'/Funktion in einem anderen ViewModel aufrufen. Die Funktion in MWVM, die ich anrufe, ändert nur, was im 'contentPresenter' präsentiert wird, basierend auf dem, was ausgewählt ist. –

Verwandte Themen