Entwickler-Ecke

WPF / Silverlight - MainViewModel access auf WPFControl (Datagrid)


RobAll - Fr 19.04.19 22:01
Titel: MainViewModel access auf WPFControl (Datagrid)
In der cs Klasse der XAML kann ich wie gewohnt auf die Controls zugreifen

Mir wurde MVVM vorgeschlagen...
Die Auslagerung des CodeBehind in das Main View Model bereitet mir Probleme.

Ich erzeuge über das MainViewModel.cs einen neuen Datensatz

C#-Quelltext
1:
context.Tab_Material_Stammdaten.Add(entity);                    

Die Datenbank wird aktualisiert.

Im nächsten Step benötige ich den Zugriff von der Klasse MainViewModel.cs auf das DataGrid der xaml um den Datensatz hinzuzufügen.
Leider finde ich keine Möglichkeit um von der Klasse MainViewModel.cs auf das Datagrid zuzugreifen.
z.B

C#-Quelltext
1:
2:
3:
4:
5:
DataGrid dg = new DataGrid(); 
dg = App.Current.MainWindow.FindName("DataGridStammdaten"as DataGrid;
dg.ItemsSource = null;
dg.Items.Refresh();
dg.ItemsSource = StammdatenView;

-> DataGrid wird nicht aktualisiert!

Der CodeBehind hat in der cs der XAML Klasse funktioniert.

Bitte um Hilfe

LG
RobAll

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Sa 20.04.19 09:31

Der Sinn vom MVVM ist ja gerade, daß dort View und ViewModel getrennt sind, also im ViewModel keine Zugriffe auf die View stattfinden.
Du mußt im XAML-Code der View mit DataBinding arbeiten und dann im ViewModel das gebundene Objekt (z.B. eine Liste vom Typ ObservableCollection) aktualisieren.

Dein unterer Code hat (selbst wenn er so funktionieren würde) einige unnötige Zuweisungen:
- erst erzeugst du ein neues DataGrid-Objekt, um es in der nächsten Zeile wieder zu überschreiben
- dasselbe dann auch für die ItemsSource

Nach welchem Tutorial oder Buch lernst du denn MVVM?


RobAll - Sa 20.04.19 19:01

Mein Buch C# von Rheinwerkcomputing

Entity Objekt kopieren

C#-Quelltext
1:
2:
3:
4:
5:
var entity = context.Tab_Material_Stammdaten
                    .AsNoTracking()
                    .FirstOrDefault(p => p.ID == Datensatz.ID);
context.Tab_Material_Stammdaten.Add(entity);
context.SaveChanges();

Dies funktioniert auch in der Datenbank.

Die Aktualisierung des Datagrid erfolgt nun über das ViewModel.


xaml
1:
2:
ItemsSource="{Binding StammdatenView}"
DataContext="{StaticResource vm}"


MainViewModel

C#-Quelltext
1:
2:
3:
4:
5:
_StammdatenList = new ObservableCollection<StammdatenViewModel>();
..
StammdatenViewModel Datensatz = StammdatenView.CurrentItem as StammdatenViewModel;
..
_StammdatenList.Add(Datensatz);

wird das gebundene Datagrid aktualisiert. Super! Th69, Danke für den Tip.


-Allerdings stehen die beiden EntityObjekte Original und Add nun in Relation, das heist beim Ändern werden beide Objekte geändert
Wie kann ich die beiden Objekte trennen?

oder

-wie kann ich die StammdatenList anderweitig aktualisieren?
Danke vorab

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: XML-Tags hinzugefügt


Th69 - So 21.04.19 09:37

Da wirst du dann wohl eine Kopie der Entity machen müssen (also entweder per new oder aber evtl. gibt es eine Clone()-Methode o.ä. - beim EF kenne ich mich inhaltlich nicht so gut aus).

Du meinst das Buch "Visual C#"? Da ist MVVM aber nur sehr rudimentär angesprochen. Es gibt einige (meist englischsprachige) ausführlichere Tutorials darüber im Internet.
Aber ich hoffe, dir ist jetzt das Grundprinzip der Trennung von M, V und VM klarer?


RobAll - Fr 26.04.19 22:26

Guten Abend,

ich schließe dieses Thema, da ich dieses Problem mit MVVM Pattern gelöst habe, sogar als Quereinsteiger.
Wer kann ein gutes deutschsprachiges Tutorial empfehlen, am besten im PDF Format?
Danke nochmal an Th69.