Wie rufen Sie functionen in einem Hauptansichtsmodell aus anderen Ansichtsmodellen auf?

Mein Programm besteht aus einem TreeView und zwei contentPresenters auf Bodenniveau. Das mainWindow, TreeView und jeder contentPresenter alle ihre eigenen viewModels.

Ich möchte eine function im mainWindowViewModel vom TreeViewViewModel .

Ich muss dies tun, weil das mainWindowViewModel steuert, was in den contentPresenters angezeigt contentPresenters , 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, vom MainWindowVM aus Zugriff auf die MainWindowVM zu erhalten, MainWindowVM TreeViewViewModel verwende:

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

Aber es macht nicht viel Sinn. weil der MWVM nicht der TreeViewViewModel des TreeViewViewModel .

Solutions Collecting From Web of "Wie rufen Sie functionen in einem Hauptansichtsmodell aus anderen Ansichtsmodellen auf?"

Die delegate Methode, die in dieser und die verknüpfte Antwort verwendet wird, kann in jeder Eltern-Kind-Beziehung und in jeder Richtung verwendet werden. Dazu gehören ein untergeordnetes Anzeigemodell, ein übergeordnetes Anzeigemodell, ein hinter dem Window Code eines untergeordneten Window oder auch reine Datenbeziehungen ohne Benutzeroberflächen. Weitere Informationen zum Verwenden von Delegatobjekten finden Sie auf der Seite Delegaten (C # -Programmierhandbuch) in MSDN.

Ich habe auf eine ähnliche Frage heute schon früher geantwortet. Wenn Sie sich die Passing-Parameter zwischen viewmodels post ansehen , sehen Sie, dass die Antwort die Verwendung von delegate Objekten beinhaltet. Sie können diese delegate (von 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.


AKTUALISIERUNG >>>

Ja, tut mir leid, ich habe ganz vergessen, dass du stattdessen Methoden aufrufen wolltest … Ich habe heute Nacht zu viele Posts bearbeitet. Wenn Sie das Beispiel aus dem anderen Post verwenden, rufen Sie einfach Ihre Methode im Handler ” ParameterViewModel_OnParameterChange :

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

Stellen Sie sich den delegate als Ihren Weg zurück zum übergeordneten Ansichtsmodell vor … es ist, als würde er ein Ereignis namens ReadyForYouToCallMethodNow. In der Tat brauchen Sie nicht einmal einen Eingabeparameter. Sie könnten Ihren delegate definieren:

 public delegate void ReadyForUpdate(); public ReadyForUpdate OnReadyForUpdate { get; set; } 

Dann im übergeordneten View-Modell (nach dem Anhängen des Handlers wie im anderen Beispiel):

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

Da Sie mehrere untergeordnete Anzeigemodelle haben, können Sie den delegate in einer anderen class definieren, auf die beide Zugriff haben. Lass es mich wissen, wenn du weitere Fragen hast.


UPDATE 2 >>>

Nachdem ich deinen letzten Kommentar noch einmal gelesen habe, habe ich mir einfach eine viel einfachere Methode ausgedacht, die vielleicht das erreichen könnte , was du willst … zumindest, wenn ich dich richtig verstehe. Es ist möglich, dass Sie direkt von Ihren untergeordneten Ansichten an Ihr übergeordnetes Ansichtsmodell binden. Dies würde beispielsweise ermöglichen, eine Button.Command Eigenschaft in einer ICommand Ansicht an eine ICommand Eigenschaft in Ihrem übergeordneten Ansichtsmodell zu ICommand :

In TreeViewView :

  

Das setzt natürlich voraus, dass eine Instanz des fraglichen übergeordneten Ansichtsmodells als MainWindow des MainWindow .

Der einfachste Weg besteht darin, eine Methode als Action an den Konstruktor des untergeordneten Ansichtsmodells zu übergeben.

 public class ParentViewModel { ChildViewModel childViewModel; public ParentViewModel() { childViewModel = new ChildViewModel(ActionMethod); } private void ActionMethod() { Console.WriteLine("Parent method executed"); } } public class ChildViewModel { private readonly Action parentAction; public ChildViewModel(Action parentAction) { this.parentAction = parentAction; CallParentAction(); } public void CallParentAction() { parentAction.Invoke(); } }