Moin,
ich hab die letzten Tage versucht zu verstehen was das MVVM-Pattern ist und wir ich das nutzen kann. Grund ist der, dass ich ab einer gewissen Komplexität meiner Projekte Schwierigkeiten habe, diese weiter zu entwickeln, da ich den Überblick verliere. Nicht ganz aber es wird immer schwerer weiter zu machen.
Mein Ziel ist es Projekte für Blazor zu schreiben. Mein Wissenstand jetzt nach Recherche-Reisen auf Google, Youtube, Stackoverflow, Github, ... .
... dass dort das Interface INotifyPropertyChanged benutzt wird, um UI und Daten zu "binden" -- "uptodate zu halten".
Jetzt wollte ich mir erstmal INotifyPropertyChanged ansehen und bin dabei bei doc.microsoft.com gelandet mit diesem Codebeispiel (der Code kann komplett copypaste in ein C# Winforms Projekt übertragen werden. Alle Steuerelemente sind schon drin. Nur NAMESPACE anpassen mit eigenem Projektnamen)
Ich hab dann das MS Beispiel mal für mich in C# Winforms nachgestellt und minimal geändert.
In der Form sind 2xBtn 1xRichTextBox 2xDataGriedViews. Leider kein CopyPaste wie beim obigen Bsp.
Spoiler anzeigen
Ich hab zur schnellen Veranschaulichung ein .gif gemacht. Da sieht man was der Unterschied ist. Das ein DataGridView wird geupdated und das andere nicht.
Jetzt meine Fragen:
1. Ist das der programmiertechnisch schwierigste Teil des MVVM (das implementieren von INotifyPropertyChanged)?
2. konkret in Blazor oder eventuell ja auch bei ASP.net: Wo kommt jetzt die BusinessLogic hin?
a. Ins Model (hab eigntlich gedacht, dass Model soll auch wie die View ohne Methoden daherkommen, damit es dann super einfach In/Out DB de/serialisiert werden kann)
b. alles in ViewModel das wird da dann aber auch schnell voll und unübersichtlich. Da ja auch noch das Konvertieren/Übergabe der Klassen ViewModel und Model stattfindet.
c. In den ganzen Tutorial hab ich unterschiedliches gelesen. "..bloss nicht ins ViewModel ... vs ... Model super einfach keine Methoden..."
3. Meiner bescheidenen Meinung nach müsste es nicht MVVM heißen sondern Model-LogikModel-View-ViewModel, wobei Model nur Propertys hat und LogiModel nur Methoden. Dann wird es aber auch schnell unübersichtlich, da man ja für jede Webside, jede Klasse auf einmal 5 Dateien hat.
4. Wie schaff ich es mehr Übersicht in meine Projekte zu bekommen? Ist MVVM eins der wichtigsten Ecksteine wenn ich Blazor-Zeugs machen möchte?
5. Gibt es etwas das ich noch vor MVVM Pattern angehen sollte, um mehr Struktur zu schaffen? Oder ist das der richtige Weg?
Im Moment bin ich happy, dass ich OOP einiger maßen mache und Dont't Repeat Yourself ist etwas das ich verfolge. Alles natürlich so gut wie ich es kann
Bin leider aus einer anderen Branche als IT. Bin ziemlich alleine unterwegs auf meinen ProgrammierAbenteuern. Danke Euch für Ideen und Ratschläge.
Hier noch das .gif
ich hab die letzten Tage versucht zu verstehen was das MVVM-Pattern ist und wir ich das nutzen kann. Grund ist der, dass ich ab einer gewissen Komplexität meiner Projekte Schwierigkeiten habe, diese weiter zu entwickeln, da ich den Überblick verliere. Nicht ganz aber es wird immer schwerer weiter zu machen.
Mein Ziel ist es Projekte für Blazor zu schreiben. Mein Wissenstand jetzt nach Recherche-Reisen auf Google, Youtube, Stackoverflow, Github, ... .
... dass dort das Interface INotifyPropertyChanged benutzt wird, um UI und Daten zu "binden" -- "uptodate zu halten".
Jetzt wollte ich mir erstmal INotifyPropertyChanged ansehen und bin dabei bei doc.microsoft.com gelandet mit diesem Codebeispiel (der Code kann komplett copypaste in ein C# Winforms Projekt übertragen werden. Alle Steuerelemente sind schon drin. Nur NAMESPACE anpassen mit eigenem Projektnamen)
Ich hab dann das MS Beispiel mal für mich in C# Winforms nachgestellt und minimal geändert.
In der Form sind 2xBtn 1xRichTextBox 2xDataGriedViews. Leider kein CopyPaste wie beim obigen Bsp.
C#-Quellcode
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Runtime.CompilerServices;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace WF_MVVM_My_INotify
- {
- public partial class FrmTwo : Form
- {
- public FrmTwo()
- {
- InitializeComponent();
- DgvResult.DataSource = LstCounterClassObjs;
- DgvResultNoEvent.DataSource = LstCounterClassObjs_NoEvents;
- }
- readonly BindingList<CounterClass> LstCounterClassObjs = new BindingList<CounterClass>();
- readonly BindingList<CounterClass_NoEvents> LstCounterClassObjs_NoEvents = new BindingList<CounterClass_NoEvents>();
- //Normal Class
- public class CounterClass_NoEvents
- {
- public int Count { get; set; }
- public CounterClass_NoEvents(int count)
- {
- Count = count;
- }
- }
- //Same now as -> MVVM Class
- public class CounterClass : INotifyPropertyChanged
- {
- //-----EventStuff : INotifyPropertyChanged
- public event PropertyChangedEventHandler PropertyChanged;
- private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
- //^^^^^EventStuff
- //Private ClassField
- private int countValue;
- //Public ClassProperty
- public int Count
- {
- get
- {
- return this.countValue;
- }
- set
- {
- if (value != this.countValue)
- {
- this.countValue = value;
- NotifyPropertyChanged();
- }
- }
- }
- //Constructor
- public CounterClass(int count)
- {
- Count = count;
- }
- }
- public CounterClass myCounterObj = new CounterClass(0);
- private void BtnFrm2Start_Click(object sender, EventArgs e)
- {
- myCounterObj.Count += 1;
- LstCounterClassObjs.Add(new CounterClass(myCounterObj.Count));
- LstCounterClassObjs_NoEvents.Add(new CounterClass_NoEvents(myCounterObj.Count));
- RtxbxResult.Text += $"{myCounterObj.Count}\n";
- }
- private void BtnChangeLastItem_Click(object sender, EventArgs e)
- {
- //Set the last Item to Zero -- with Event DatagriedView gets Updated -- without NOT
- var itemCounter = LstCounterClassObjs.Count;
- if (itemCounter > 0 )
- {
- LstCounterClassObjs[itemCounter-1].Count = 0;
- }
- var itemcounter_NoEvents = LstCounterClassObjs_NoEvents.Count;
- if (itemcounter_NoEvents > 0)
- {
- LstCounterClassObjs_NoEvents[itemcounter_NoEvents-1].Count = 0;
- }
- }
- }
- }
Ich hab zur schnellen Veranschaulichung ein .gif gemacht. Da sieht man was der Unterschied ist. Das ein DataGridView wird geupdated und das andere nicht.
Jetzt meine Fragen:
1. Ist das der programmiertechnisch schwierigste Teil des MVVM (das implementieren von INotifyPropertyChanged)?
2. konkret in Blazor oder eventuell ja auch bei ASP.net: Wo kommt jetzt die BusinessLogic hin?
a. Ins Model (hab eigntlich gedacht, dass Model soll auch wie die View ohne Methoden daherkommen, damit es dann super einfach In/Out DB de/serialisiert werden kann)
b. alles in ViewModel das wird da dann aber auch schnell voll und unübersichtlich. Da ja auch noch das Konvertieren/Übergabe der Klassen ViewModel und Model stattfindet.
c. In den ganzen Tutorial hab ich unterschiedliches gelesen. "..bloss nicht ins ViewModel ... vs ... Model super einfach keine Methoden..."
3. Meiner bescheidenen Meinung nach müsste es nicht MVVM heißen sondern Model-LogikModel-View-ViewModel, wobei Model nur Propertys hat und LogiModel nur Methoden. Dann wird es aber auch schnell unübersichtlich, da man ja für jede Webside, jede Klasse auf einmal 5 Dateien hat.
4. Wie schaff ich es mehr Übersicht in meine Projekte zu bekommen? Ist MVVM eins der wichtigsten Ecksteine wenn ich Blazor-Zeugs machen möchte?
5. Gibt es etwas das ich noch vor MVVM Pattern angehen sollte, um mehr Struktur zu schaffen? Oder ist das der richtige Weg?
Im Moment bin ich happy, dass ich OOP einiger maßen mache und Dont't Repeat Yourself ist etwas das ich verfolge. Alles natürlich so gut wie ich es kann

Bin leider aus einer anderen Branche als IT. Bin ziemlich alleine unterwegs auf meinen ProgrammierAbenteuern. Danke Euch für Ideen und Ratschläge.
Hier noch das .gif
codewars.com Rank: 4 kyu