2013-02-18 15 views
5

Ich entwickle WPF-Anwendung mit MVVM Light Toolkit. Ich habe ein DataGrid in meinem Hauptfenster.Ich habe ein anderes Fenster namens "openfile" erstellt und ihre viewmodels.Main Window ViewModel-Klasse öffentliche Eigenschaft enthalten des Typs ObservableCollection MyList, der an das Datagrid gebunden ist. Kann ich diese Eigenschaft aus dem Openfile Viewmodel füllen und automatisch an Datagrid binden? oder kann ich ein Varaible an MainViewmodel übergeben und im OpenViewViewModel einen Aufruf an eine öffentliche Funktion im MainViewModel machen?Übergabe von Werten zwischen Viewmodel in MVVM in WPF

So rufe ich MyPage über die Menüleiste auf.

private void NotificationMessageReceived(NotificationMessage msg) 
     { 
      switch (msg.Notification) 
      { 
       case Messages.MainVM_Notofication_ShowNewbWindow: 
        new NewView().ShowDialog(); 
        break; 
       case Messages.MainVM_Notofication_ShowExistingWindow: 
        new OpenExisitingView().ShowDialog(); 
        break; 

       case Messages.MainVM_Notofication_ShowotherWindow: 
        newView().ShowDialog(); 
        break; 
      } 
     } 

Vielen Dank im Voraus. Roshil K

+0

Möchten Sie einige Beispiel-Code für das Szenario liefern können Sie beschreiben? Wenn MyList bereits an das Datagrid gebunden ist, sollten Aktualisierungen der Liste Ihr Grid automatisch aktualisieren. Wenn MyList eine öffentliche Eigenschaft ist und die VM der geöffneten Datei einen Verweis auf Ihre Haupt-VM hat, sollten Sie sie direkt auffüllen können. – Dutts

+0

Wie öffnest du 'OpenFile'? –

+0

Ich öffne OpenFile Window über die Menüleiste. –

Antwort

3

Nach ein bisschen Recherche Ich habe die aktuelle Instanz meines Mainviewmodels durch folgenden Code bekommen.

MainViewModel mainViewModelInstaince = ServiceLocator.Current.GetInstance<MainViewModel>(); 

dann habe ich alle Methoden und Eigenschaften..und gebunden die Daten von einem anderen Viewmodel.

Dank an alle ..

1

Der einfachste Weg ist MainWindowViewModel ‚s Instanz OpenFileViewModel weitergeben müssen:

public class OpenFileViewModel 
{ 
    private MainWindowViewModel _parent; 

    public OpenFileViewModel(MainWindowViewModel parent) 
    { 
      _parent = parent; 
    } 
} 

Danach rufen Sie/jede öffentliche Methode/Eigenschaft Zugang in MainWindowViewModel können:

foreach (var item in _parent.myList) 
{ 
    ... 
} 
1

Sie können eine Klasse erstellen, die Ihren „Mediator Service“ sein können, und es wird zwischen Ihrem Viewmodel sitzt. Sie können Ihren Mediator-Dienst registrieren und Ereignisse hinzufügen, die Sie von einer VM abrufen und in einer anderen VM verwalten können. Es kann wie sein:

public class MediatorService: IMediatorService 
{ 
    public dynamic Data { get; set;} 
    public event EventHandler<YourCustomEventArgs> Callback = delegate { } 
} 

public class XYZVM(IMediatorService mediatorService) 
{ 
// set your Data here and handle Callback event here and refresh your grid. 
// you can get anything from your "YourCustomEventArgs" which you will set from ABCVM 
} 

public class ABCVM(IMediatorService mediatorService) 
{ 
// get your data here and raise callback here and handle that in XYZVM 
} 

Hope this helfen Ihnen ..