2017-12-16 3 views
1

Ich habe Schwierigkeiten zu verstehen, wie ObservableCollection in ViewModel2, das in ViewModel1 definiert wurde, zu aktualisieren. Ich habe viel darüber nachgesucht, wie man das macht, aber ich habe kein richtiges Verständnis bekommen. Ich benutze MVVM Light Framework.Mvvm: Wie aktualisiere ich meine ObservableCollection <customobject> von einem anderen ViewModel?

Ich habe ein DozentViewModel, das eine ObservableCollection von Dozenten hat. Ich habe ein weiteres AddDozentViewModel, mit dem neue Dozent über Entity Framework zur Datenbank hinzugefügt werden können. Aber wie füge ich das neue Dozent meiner ObservableCollection im DozentViewModel hinzu?

Das ist mein DozentViewModel:

public class DozentViewModel : ViewModelBase 
{ 
    private IDozentDB _dozentDB; 
    private ObservableCollection<Dozent> _dozentList; 
    private string _nachName; 
    private string _vorName; 
    private string _akadGrad; 

    public RelayCommand ShowAddDozentCommand { get; private set; } 

    public ObservableCollection<Dozent> DozentList 
    { 
     get { return _dozentList; } 
     set 
     { 
      Set(ref _dozentList, value); 
      RaisePropertyChanged("DozentList"); 
     } 

    } 

    public DozentViewModel(IDozentDB dozentDB) 
    { 

     _dozentDB = dozentDB; 
     DozentList = new ObservableCollection<Dozent>(); 

     // To get list of all Dozents 
     DozentList = _dozentDB.GetAllDozents(); 

     ShowAddDozentCommand = new RelayCommand(ShowAddDozentViewExecute); 

    } 

ich die DozentList eigenschaft auf meine DozentView gebunden habe:

<DataGrid ItemsSource="{Binding DozentList,UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False" CanUserAddRows="False" IsReadOnly="True" Grid.Column="0" >

Das ist mein AddDozentViewModel des neuen Dozenten in meiner SQL-Datenbank erstellt.

Ich verstehe, dass ich gerade den neuen Dozent zur Datenbank hinzufüge und die ObservableCollection nicht aktualisiere. Daher wird meine DataGridView auf DozentView nicht aktualisiert. Wie mache ich das? Jede Information wäre sehr hilfreich !!

Danke, Vinitha

Antwort

0

Was ich hier zu tun aussehen würde, ist etwas entlang der Linien von AddDozentViewModel eine Eigenschaft von DozentViewModel machen, die einen Verweis auf seine Eltern enthalten würden, zum Beispiel:

public class AddDozentViewModel 
{ 
    private readonly DozentViewModel _parent; 

    ... 

    public AddDozentViewModel(DozentViewModel parent, IDozentDB dozentDB) 
    { 
     _parent = parent; 
     _dozentDB = dozentDB; 
    } 

    ... 

    private void AddDozent() 
    { 
     Dozent dozent = new Dozent(); 
     dozent.DozentNachname = this.NachName; 
     dozent.DozentVorname = this.VorName; 
     dozent.AkadGrad = this.AkadGrad; 

     _dozentDB.Create(dozent); 

     _parent.DozentList.Add(dozent); 

     Messenger.Default.Send(new NotificationMessage("CloseAddDozentView")); 

     _parent.AddDozentViewModel = null; // this will dispose of the AddDozentViewModel 
    } 

    ... 
} 

Die DozentViewModel wäre daher wie folgt aussehen:

public class DozentViewModel : ViewModelBase 
{ 
    ... 

    private AddDozentViewModel _addDozentViewModel; 
    public AddDozentViewModel AddDozentViewModel 
    { 
     get { return _addDozentViewModel; } 
     set 
     { 
      Set(ref _addDozentViewModel, value); 
      RaisePropertyChanged("_addDozentViewModel"); 
     } 
    } 

    ... 
} 

Um besonders sicher zu sein, dass die neue Dozent in die Datenbank geschrieben wurde und ich mich immer wie mit der Datenbank synchronisiert fühle, würde ich vielleicht die neue Dozent aus der Datenbank abfragen, bevor ich sie zu DozentList hinzufüge . So würde das AddDozent() Methode zu etwas wie ändern:

private void AddDozent() 
{ 
    Dozent dozent = new Dozent(); 
    dozent.DozentNachname = this.NachName; 
    dozent.DozentVorname = this.VorName; 
    dozent.AkadGrad = this.AkadGrad; 

    _dozentDB.Create(dozent); 

    Dozent newDozentFromDB = // retrieve it from _dozentDB here 

    _parent.DozentList.Add(newDozentFromDB); 

    Messenger.Default.Send(new NotificationMessage("CloseAddDozentView")); 

    _parent.AddDozentViewModel = null; // this will dispose of the AddDozentViewModel 
} 
+0

Vielen Dank für diese Klarstellung. – Vini

+0

Es hat funktioniert !! :) Ich habe einen trivialen Zweifel. Ich mochte die Idee, neu hinzugefügte Dozent aus der Datenbank zu holen und sie meiner ObservableCollection hinzuzufügen. In diesem Fall fange ich das Dozent mit seiner ID wie folgt an: 'Dozent newDozentFromDB = _dozentDB.GetDozent (dozent.DozentId);'. Ich hoffe, dass ich den Dozent mit der richtigen Dozent ID retreisiere? Wie auch immer, es funktioniert und ich kann die aktualisierte Sammlung im Datagrid anzeigen. – Vini

+0

Ja, ich war mir nicht sicher, wie du die Datenbank bearbeitest, also habe ich die Besonderheiten weggelassen, aber jede Art, deinen eigenen Dozent zu identifizieren, ist in Ordnung. Sie könnten dies sogar in eine Methode umwandeln, die ein 'Dozent' akzeptiert, es der Datenbank hinzufügt und ein' Dozent' zurückgibt, das Sie zur Sammlung hinzufügen können. –

0

Sie können Messenger die Verwendung MVVMLight für Viewmodel Kommunikation.

zum Beispiel:

public class AddDozentViewModel 
{ 
    //... 

    private void AddDozent() 
    { 
     Dozent dozent = new Dozent(); 
     //... 

     Messenger.Default.Send(new NewDozentAddedMessage(dozent)); 
    } 
} 

public class DozentViewModel 
{ 
    //... 

    private ObservableCollection<Dozent> _dozentList; 
    public DozentViewModel() 
    { 
     Messenger.Default.Register<NewDozentAddedMessage>(this, HandleNewDozentAddedMessage); 
    } 
    private void HandleNewDozentAddedMessage(NewDozentAddedMessage obj) 
    { 
     _dozentList.Add(obj.DozentObject); 
    } 
} 

public class NewDozentAddedMessage 
{ 
    public Dozent DozentObject { get; } 
    public NewDozentAddedMessage(Dozent dozentObject) 
    { 
     DozentObject = dozentObject; 
    } 
} 
+0

Vielen Dank für diese Information! Es hat wirklich geholfen. – Vini

Verwandte Themen