MVVM Umsetzung mit WinForms
- VB.NET
- .NET (FX) 4.5–4.8
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 194 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.
-
-
Haudruferzappeltnoch schrieb:
wieso ist das ein Notfall?
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
-
Haudruferzappeltnoch schrieb:
Die Instanz auf dem Form zu haben ist ja auch nicht schlimm.
Aber ich hab halt einen Workaround gefunden - eine Methode, die alle Bindings umstöpselt von der lokalen tDS-Instanz auf die globale.
Haudruferzappeltnoch schrieb:
das ist in WPF der DataContext, da nimmt man sich auch die Instance der VM rein.
-
Moin moin
Du kannst das Zellenformat vorab im Designer festlegen:
Ja das weis ich und das hatte ich auch erst so gemacht. Aus irgendeinem Grund wurde das Datum und eine andere Spalte aber immer "falsch" formatiert.
Z.B. bei der Luftfeuchte wurde immer 55.00 % angezeigt, beim Datum: 2024-07-14T17:36:15.4780243+02:00
Das ist GUI-Arbeit, also in View,
OK, dann habe ich ja doch wieder Code auf dem Form. Sehr verwirrend
ihr VM auf GUI-Unabhängigkeit zu prüfen
Nunja das meiste funktioniert auch ohne eine GUI. Das sehe ich ja an den ganzen "Debug/Console-Ausgaben" die ich immer wieder in die Klassen / Methoden einbaue.Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. -
ErfinderDesRades schrieb:
dass jedes Form sein eigenes Dataset enthält (im DesignerCode instanziert)
Oder man könnte ein dummyDS aufs Form tun und so die DGVs einstellen und dann beim Aufruf des Forms die DataSource umstöpseln. Das ist wahrscheinlich was du machst.
Der Designer meldet wenn man dort die globale Instanz verwenden will, dass der Member nicht existiert.
Das ist der einzige Unterschied zum DataContext
Aber das ist ja nicht die Schuld des DataSets, von daher ist an dieser Stelle WinForms altbackener als tDS
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()
-
offtopic
Dann werf ich nochmals zu dem Thema ein, was ich ebenfalls schon ein paar Mal in den vergangenen Jahren dazu schrieb und hier auch kurz erwähnt hatte: Jedes Form hat seine tDS-InstanzFtDS
, man packt ne BSBsTds
auf's Form, die anFtDS
bindet, alle anderes BSs binden an dieBsTds
statt anFtDS
und wenn man dann ein Form F2 von einem anderen Form F1 aus aufruft, legt man die tatsächliche tDS-Instanz als DataSource der F2-BsTds fest, z.B. mitF2.BsTds.DataSource = F1.BsTds.DataSource
. Alle BSs von F2 sind dann effektiv immer an das one-and-only tDS angebunden und alles ist gut.
/offtopic
Aber zurück zum Thema: @Amelie: Ich hätte mir denken müssen, dass Dich meine Aussage verwirrt, weil ich anfangs immer schrieb: kein Code im View. Ich hätte damals schon klar sagen müssen: kein Code im View, der nicht ausschließlich für die Optik zuständig ist. MVVM ist eine Schichten- und Aufgabentrennung. Code im View darf sich nur um Viewaufgaben kümmern. Und das ist eben Optik. Man könnte auch sagen: Um das View kümmert sich ein menschlicher Designer. Er kann den Code im View-CodeBehind so erstellen, dass das View hübsch aussieht. Für die Businesslogik ist jemand in einer anderen Abteilung zuständig. Der menschliche Designer soll sich nur darum kümmern, wie die Oberfläche/das View aussieht. Dazu darf er (und muss es manchmal auch) Code verwenden. Aber eben nur solchen, der die Daten zwar auswerten darf, aber diese nicht manipuliert. Also quasi ReadOnly.
Ich hoffe, dass mir die anderen da zustimmen, ansonsten bitte präzisieren oder korrigieren.
Amelie schrieb:
Aus irgendeinem Grund wurde das Datum und eine andere Spalte aber immer "falsch" formatiert.g
festlegen, um Datum und Zeit in Kurzformat zu bekommen. Bei der Luftfeuchtigkeit kannst Du bei datentyp- und wertabhängig mal probieren. Vielleicht%
, vielleicht# "%"
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
VaporiZed schrieb:
Ich hoffe, dass mir die anderen da zustimmen, ansonsten bitte präzisieren oder korrigieren.
Nur würde ich das laxer handhaben.
Weil Ich halte Winforms generell (noch?) für ungeeignet, um damit ein strenges MVVM umzusetzen.
Da hilft auch kein CommandBinding, erst recht nicht, wenn so dermassen buggy.
Mir scheint WinForms-MVVM nur mit unverhältnismässigem Zusatz-Aufwand möglich, und ohne wirklichen architektonischen Gewinn. ZB die berühmte GUI-Austauschbarkeit - Das ist doch eine theoretische Phantasterei, die wir Normalsterbliche niemals praktisch umsetzen werden.
Beispielsweise so eine simple Anforderung an ein DGV, einen doppelgeklicksten Datensatz im Einzel-Formular editieren zu können.
In Oldschool ist das banal: 5 Zeilen ins Codebehind, die jeder Anfänger versteht.
In MVVM wäre das doch ein gewaltiger Aufriss, mit Factories ("Service" ist glaub der falsche Begriff dafür), Interfaces und Kram, oder irre ich mich?
Und jeder machts auch noch anders, und jede Variante ist auf ihre Weise undurchsichtig - für was?
Oder du selektierst 6 Datensätze, um sie mit einem Click zu löschen - das ist auch so ein Fall wo Oldschool sich langweilt, während MVVM einen Breakdance mit Kopfstand aufführt?
Also ich bin sehr dafür, komplexere Datenverarbeitung möglichst aus dem CodeBehind herauszuverlagern ins Model, oder Viewmodel.
Aber die Control-Eventhandler täte ich im CodeBehind belassen.
Ist halt Winforms, und nicht Wpf.
-
@VaporiZednullHabe nun mal ein bissel weiter gemacht und ja klappt soweit. (siehe Bild)
Ich hatte dasPrivate Sub UpdateShow()
zwar auch schon im ViewModel aber da hatte ich das Problem, das ich immer erst einmal mit dem Monat blättern musste, damit die Daten angezeigt wurden.
Hab das bis jetzt auch nicht anders hinbekommen... wohl grade blind...
PS: das mit dem%
muss so sein im Designer:'%'
Das Model:
Spoiler anzeigen
VB.NET-Quellcode
- '/ file: DailyDataLoader.vb ( Model )
- Public Class DailyDataLoader
- Public Property CurrFilename As String
- Get
- Return $"DailyDatas_{Configuration.Instance.CurDatum.ToString("MM_yyyy")}.xml"
- End Get
- Set(value As String)
- End Set
- End Property
- ' Pfad zur XML-Datei mit den täglichen Wetterdaten
- Private ReadOnly DailyXmlPath As String = Path.Combine(Configuration.Instance.DataXmlFilePath, CurrFilename)
- ' Methode zum Laden aller täglichen Wetterdaten aus der XML-Datei
- Public Function LoadAllDailyWeatherData() As List(Of DailyWeatherData)
- Dim dailyWeatherDataList As New List(Of DailyWeatherData)()
- If File.Exists(DailyXmlPath) Then
- Dim ds As New DataSet()
- ds.ReadXml(DailyXmlPath)
- If ds.Tables.Contains("DailyMeasurements") AndAlso ds.Tables("DailyMeasurements").Rows.Count > 0 Then
- For Each row As DataRow In ds.Tables("DailyMeasurements").Rows
- Dim dailyWeatherData As New DailyWeatherData()
- dailyWeatherData.ID = If(IsDBNull(row("ID")), 0, Convert.ToInt32(row("ID")))
- dailyWeatherData.Datum = If(IsDBNull(row("Datum")), DateTime.MinValue, Convert.ToDateTime(row("Datum")))
- dailyWeatherData.Temp1 = If(IsDBNull(row("Temp1")), 0D, Convert.ToDecimal(row("Temp1")))
- dailyWeatherData.Temp2 = If(IsDBNull(row("Temp2")), 0D, Convert.ToDecimal(row("Temp2")))
- dailyWeatherData.Temp3 = If(IsDBNull(row("Temp3")), 0D, Convert.ToDecimal(row("Temp3")))
- dailyWeatherData.Humidi1 = If(IsDBNull(row("Humidi1")), 0D, Convert.ToDecimal(row("Humidi1")))
- dailyWeatherData.Humidi2 = If(IsDBNull(row("Humidi2")), 0D, Convert.ToDecimal(row("Humidi2")))
- dailyWeatherData.Humidi3 = If(IsDBNull(row("Humidi3")), 0D, Convert.ToDecimal(row("Humidi3")))
- dailyWeatherData.Pressure1 = If(IsDBNull(row("Pressure1")), 0D, Convert.ToDecimal(row("Pressure1")))
- dailyWeatherData.Pressure2 = If(IsDBNull(row("Pressure2")), 0D, Convert.ToDecimal(row("Pressure2")))
- dailyWeatherData.Pressure3 = If(IsDBNull(row("Pressure3")), 0D, Convert.ToDecimal(row("Pressure3")))
- ' Das DailyWeatherData-Objekt zur Liste hinzufügen
- dailyWeatherDataList.Add(dailyWeatherData)
- Next
- End If
- End If
- Return dailyWeatherDataList
- End Function
- End Class
Das ViewModel:
Spoiler anzeigen
VB.NET-Quellcode
- '/ file: P0_ShowDataViewModel.vb ( ViewModel )
- Partial Public Class ShowDataViewModel
- Inherits PropertyChange
- ' Singleton-Instanz des ViewModels
- Private Shared ReadOnly _instance As New Lazy(Of ShowDataViewModel)(Function() New ShowDataViewModel())
- Public Shared ReadOnly Property Instance As ShowDataViewModel
- Get
- Return _instance.Value
- End Get
- End Property
- ' BindingList zur Datenbindung mit dem DataGridView
- Public ReadOnly Property MonthlyWeatherDataList As New BindingList(Of WeatherData)
- Public ReadOnly Property DailyWeatherDataList As New BindingList(Of DailyWeatherData)
- Public Sub New()
- AktlMonth = Configuration.Instance.CurDatum
- End Sub
- ' Methoden zum Laden der Daten aus dem Model ins ViewModel
- Public Sub LoadMonthlyDataFromModel(MonthlyMeasurementsList As List(Of WeatherData))
- MonthlyWeatherDataList.Clear()
- For Each MonthlyMeasurement In MonthlyMeasurementsList
- MonthlyWeatherDataList.Add(MonthlyMeasurement)
- Next
- End Sub
- Public Sub LoadDailyDataFromModel(dailyMeasurementsList As List(Of DailyWeatherData))
- DailyWeatherDataList.Clear()
- For Each dailyMeasurement In dailyMeasurementsList
- DailyWeatherDataList.Add(dailyMeasurement)
- Next
- End Sub
- ' Methode für den vorherigen Monat
- Public Property MoveToPreviousMonthRelayCommand As New RelayCommand(AddressOf PreviousMonth)
- Private Sub PreviousMonth()
- Configuration.Instance.MoveToPreviousMonth()
- AktlMonth = Configuration.Instance.CurDatum
- End Sub
- ' Methode für den nächsten Monat
- Public Property MoveToNextMonthRelayCommand As New RelayCommand(AddressOf NextMonth)
- Private Sub NextMonth()
- Configuration.Instance.MoveToNextMonth()
- AktlMonth = Configuration.Instance.CurDatum
- End Sub
- ' Methode um den ausgewählten Monat anzuzeigen
- Private _aktlMonth As DateTime
- Public Property AktlMonth As DateTime
- Get
- Return _aktlMonth
- End Get
- Set(value As DateTime)
- If _aktlMonth <> value Then
- _aktlMonth = value
- OnPropertyChanged()
- End If
- End Set
- End Property
- End Class
Das View:
Spoiler anzeigen
VB.NET-Quellcode
- '/ file: FrmSowCityDatas.vb
- Public Class FrmShowCityDatas
- Private ReadOnly _viewModel As ShowDataViewModel = ShowDataViewModel.Instance
- Public Sub New()
- InitializeComponent()
- DgvDailydatas.AutoGenerateColumns = False
- DgvMonthdatas.AutoGenerateColumns = False
- UpdateShow()
- End Sub
- Private Sub UpdateShow()
- LoadAndSetData()
- ShowDataInDGV()
- UpdateMonth()
- End Sub
- Private Sub LoadAndSetData()
- Dim monthlyDataLoader As New MonthlyDataLoader()
- Dim monthlyWeatherDataList As List(Of WeatherData) = monthlyDataLoader.LoadAllMonthlyWeatherData()
- _viewModel.LoadMonthlyDataFromModel(monthlyWeatherDataList)
- Dim dailyDataLoader As New DailyDataLoader()
- Dim dailyWeatherDataList As List(Of DailyWeatherData) = dailyDataLoader.LoadAllDailyWeatherData()
- _viewModel.LoadDailyDataFromModel(dailyWeatherDataList)
- End Sub
- Private Sub ShowDataInDGV()
- DgvDailydatas.DataSource = _viewModel.DailyWeatherDataList
- DgvMonthdatas.DataSource = _viewModel.MonthlyWeatherDataList
- End Sub
- Private Sub UpdateMonth()
- MonthTxtBoxMenuItem.Text = _viewModel.AktlMonth.ToString("MMMM yyyy")
- End Sub
- Private Sub MonthPrevMenuItem_Click(sender As Object, e As EventArgs) Handles MonthPrevMenuItem.Click
- _viewModel.MoveToPreviousMonthRelayCommand.Execute(Nothing)
- UpdateShow()
- End Sub
- Private Sub MonthNextMenuItem_Click(sender As Object, e As EventArgs) Handles MonthNextMenuItem.Click
- _viewModel.MoveToNextMonthRelayCommand.Execute(Nothing)
- UpdateShow()
- End Sub
- End Class
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen.Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Amelie“ ()
-
Würdest Du das Projekt hochladen wollen? Dann kann ich auch einen Blick auf die DataBindings werfen und besser damit rumspielen und nach Verbesserungen schauen.
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
@VaporiZed
Es ist echt zum mit dem S.....
Haste das eine endlich zum laufen gebracht, funktionieren andere Sachen nicht mehr.
Nun klappt es mit den Monats-Dateien erstellen und im DGV anzuzeigen. Das Blättern der Monate funktioniert und dann..
Gebe Daten ins DGV ein; Speichern. Datei wird geändert (Zeitstempel im Explorer) aber es werden keine Daten die ich eingegeben habe gespeichert.
Obwohl ich mir Mühe gebe, kommt es mir vor als wenn ich zwischen Haufen von Dateien hinundher springe und dann auf dem Weg alles an Daten etc verliere....Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen.Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Amelie“ ()
-
- In
StartMain
gibt es die ZeilemainViewModel
-Konstruktor:Func
-Konstrukt? - Wozu gibt es eine BindingSource im DataService? Die BindingSource ist eine WinForms-Komponente und gehört somit ins View/GUI/Form.
- Der Konstruktor in der
WinFormsWindowService
-Klasse: Aber der mainViewModel-Parameter wird nicht verwendet. Wozu also? - Warum wird in
Public Sub ShowMain()
das ConfigViewModel mitgegeben? - Warum kennt die WinFormsWindowService-Klasse überhaupt konkrete ViewModels?
- Diese
Lazy(Of …)(Function() New …)
-Konstrukte find ich zwar interessant. Aber wozu brauchst Du sie?
Object
entgegennimmt und an das gewünschte Form weiterreicht. Das Form castet das Teil dann wieder zurück in den Solltyp. Das nennt man Boxing/Unboxing. Was soll jetzt der Blödsinn, also erst in ein anonymes Paket einpacken und später wieder auspacken? Der WindowService muss nicht mehr wissen, was für ViewModels es gibt. Du wärst damit nur noch wenig davon entfernt, den WindowService so zu gestalten, dass er in anderen MVVM-Projekten auch verwendet werden kann. Dazu müssten wir nur noch die Form-Typen aus der WindowService-Klasse entfernen. Aber eines nach dem anderen.
Dass das DataSet und die BindingSource im DataService nun direkt als Datenquelle hergenommen werden, ist net so dolle. Du kannst gern ein typisiertes DataSet verwenden. Aber untypisiert macht es die Sache fehleranfäiig. Grundsätzlich würde ich sogar Modelklassen verwenden, also sog. POCOs. Die übernehmen dann die Daten aus der Datenquelle und deren Daten werden beim Speichern auch wieder in die Datenquelle reingeschoben. Was diese Datenquelle ist und wie die Daten von A nach B kommen, bleibt Dir überlassen. Du kannst ne XML-Datei mit angeschlossenem tDS verwenden, Du kannst die Daten auch direkt als JSON abspeichern oder irgendwann ne Datenbank anschließen. Aber die direkte Verwendung eines untypisierten DataSets plus BindingSource in einer Datenklasse ist nicht empfehlenswert.
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. - In
-
@VaporiZed
Ich habe seit gestern noch wieter gemacht.. mit dem Resultat, das alles nicht mehr funktioniert.
Es ist enfach zu frustrierend wenn irgendwann nichts mehr geht. Bin dann wohl zu blöd zum progrmaiern..
Danke trotzdem.Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. -
Amelie schrieb:
mit dem Resultat, das alles nicht mehr funktioniert.
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
@VaporiZed
Moin moin
1.) Dieses Lazy gedööööns
Als ich noch kein VS 2022 hatte machte ich die Singelton Classes immer so:
Das hat VS 2022 immer angemeckert. Dann suche ich im www und fragte bei GPT nach Infos dazu.
Thread-Sicherheit: Lazy(Of T) bietet eine eingebaute Thread-Sicherheit, die sicherstellt, dass nur eine Instanz des Objekts erstellt wird, selbst wenn mehrere Threads gleichzeitig auf die Instance-Eigenschaft zugreifen.
Das ist wohl der Hauptvorteil.
-------------
Aber schrittweise Backups...
Ja habe ich gemacht und gestern Mittag alles auf die externe Platte kopiert und Intern gelöscht!
Da ist soviel durcheinander usw... ich blicke schon nicht mehr durch.
Habe nun alles bereinigt ( aus das Studio ) und neu begonnen.... Dazu später mehr ...
.....
Ich habe ja eine "fertige, laufende" Version, die das macht was ich mir vorstellte. Ist halt Spaghetti - Code vom aller feinstem. Alles wild durcheinander usw...
Jetzt hat aber ein Bekannter das gesehen und möchte das auch haben... mit ein paar Abwandlungen...
Also habe ich ein ganz sauberes Projekt angelegt und schon mal etwas Vorbereitet. Will aber Schritt für Schritt vorgehen.
Modelklassen verwenden, also sog. POCOs
Habe ich erstellt usw.. ... Später mehr inkl sauberen Code.Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. -
Amelie schrieb:
Also habe ich ein ganz sauberes Projekt angelegt und schon mal etwas Vorbereitet.
hmm...
Vielleicht solltet ihr Regeln einführen weil dieses "Ichmachmalwas..." -> "hab Schonmal weitergemacht..." -> "hab wieder von vorne angefangen..." - ich fürchte, auf Dauer werden dich nicht viele dabei begleiten wollen.
-
Also ich verfolge diesen Thread ja schon. Denn ich schrecke davor zurück, MVVM mit WinForms zu kombinieren. Da lohnt sich schon ein Einblick, welche Erfahrungen da gemacht werden. Des weiteren bin ich der Meinung, dass redesigns eher zu selten als zu oft gemacht werden. Mir stellt sich jedoch eine grundsätzlicherer Frage : ist die Verwendung von WinForms als Viewmodell als Strategie zu teuer?
Zusätzlich würde ich noch anmerken wollen, das ich MVVM mit den bisher genannten Argumenten nicht verkaufen könnte.
Man möge mich korrigieren, aber ich glaube nur die Argumente
>Designabteilung arbeitet freier und
>Codeparadigmen sind besser
gelesen zu haben.
Mein Argument pro MVVM wäre die Vermutung, dass es einfacher automatisierbar ist. Das wäre in meiner Situation auch sehr schlagkräftig.
Ich stelle mir folgende zusätzliche Fragen zu MVVM (die ggfls je nach Umfang des zu erstellenden Programms variieren können)
a) ist der Code dadurch übersichlicher / einfacher
b) ist die Wartbarkeit besser ?
c) ist die Implementierung der Funktionalitäten damit weniger fehleranfällig ?
d) ist die Erweiterbarkeit des Codes dadurch besser ?
e) geht das Implementieren schneller?
f) wie hoch sind die Lernhürden (Dichte und Anzahl der Fachbegriffe, die die Erlärungen spicken) ?
g) wie sieht es mit der multiplattformunterstützung aus ?
h) gibt es Einschränkungen, die die Implementierung unmöglich machen bzw ad absurdum führt ? (spezielle Controls,..)
Selbst wenn die Antworten individuell recht unterschiedlich ausfallen können und eine Auswertung des weltweit vorhandenen Programmcodes wünschenswert aber unmöglich ist, bleiben diese Fragen im meinen Augen Key. Unter der Annahme dass es darum geht, das Programm in einen möglicht funktionalen Zustand zeitnah fertig zu stellen. Wenn überhaupt, dann fehlen eher noch einige Fragen.
Ich frage also nach einem Resumee der Beteiligten unter Berücksichtigung einiger der Fragen, und was nun tatsächlich best practice ist und was nicht. -
Moin moin
Ich selber bezeichne mich ja noch immer als "Programmier-Anfänger" und durch mein Asperger habe ich es nicht immer so einfach wie andere.
Meine Programme sind zu 90% reine Übungen und rein private. Auch wenn nun ein Bekannter mein kleines Prog haben möchte, freut mich das zwar aber ich sehe das dann nochmal als ansporn es besser zu machen als meine eigene "Spaghetti-Code-Version"
Um Praxis zu bekommen und wenn ich mich mal wieder total verheddere, muss ich einfach neu, bei Null beginnen, sonst kommt ich aus dem verkorstem Code nicht mehr raus.
@ErfinderDesRades
Nein es muss nicht von vorne begonnen werden. Der Grundaufbau bleibt ja erhalten.
Das einzige was ich wegen der Probleme mit dem ".Net 8" gemacht habe, ich bin zurück zum ".Net FW"
@Coldfire
Aus meiner Sicht und Erfahrung, mein bestehendes kleines Prog nach "MvvM" zu redisignen, versuche ich hier ein paar deiner Fragen zu beantworten.
a) für mich ist es sehr anstengend die Übersicht zu behalten. Ich erwähnte ja schon, das es mit oft so vorkommt, das ich von "a" nach "b" nach "c" und wieder zurück nach "a" springe.
Ja oft muss man das wohl im "MvvM" wobei eigentlich ist es ja: "M-VM-V"
b) kann ich noch nicht sagen
c) & d) wäre durchaus möglich
e) wenn man das ganze mal zu 100% verstanden hat und ein 100% Wasserdichtes Konzept und viel Programmiererfahrung hat, geht es bestimmt schneller
f) für mich noch sehr hoch und an reines MvvM mit Wpf ... gehe ich noch lange nicht dran.
g) weiß ich nicht
h) bei den Controls habe ich festgestellt, das die "Menue-Leiste" und "Status-Leiste" mit diesen einfachen Bindungen nicht zurecht kommen:
Dabei ist es egal ob es ein Label, eine Textbox oder eine ComboBox aus der MenueLeiste ist.
So als Resumeè was ich bis her sagen kann.
An dem jetzigen Code sehe ich schon, das es "aufgeräumter" ist als noch mit meiner herkömmlichen Classen-Methode. Da war halt zuviel in den einzelnen Classen was da nicht hingehörte. Und ja ist bestimmt jetzt auch noch so, weil es für mich oft noch verwirrend ist;
kommt der Code-Block nun ins "Model" oder ins "ViewModel"
... oder in den Trash
Was ich noch sagen kann, deswegen ja auch der "Neubegin":
Ich der vorletzen Version habe ich, schön nach dem Tenor von @ErfinderDesRades ,ein tDataset usw im Designer aufgebaut. Dann habe ich versucht dafür ein Interface zu erstellen und dann fingen die großen Probleme an. Habe dann solange rumgemacht, bis nichts mehr ging....
Also nun den Vorschlag von @VaporiZed mit den "POCOs".
Erst das "Model" erstellen und dann ... ... War zwar viel Schreibarbeit bis ich das Laden und Speichern hinbekommen hatte aber es klappt.
Noch zum Abschluss für diesen Text hier.
Ich finde es äußerst verwirrend, wenn Code der in VS2017 / VS2019 noch funktionierte dann in VS2022 nicht mehr geht... Erwähnt ich hier auch schon, bzgl der Singelton Class ...Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. -
Coldfire schrieb:
>Codeparadigmen sind besser
Außerdem folgt c eher aus a als das ein spezielles Paradigma das explizit verbuchen könnte und wie ist d definiert, wenn nicht durch e?
Zu f):
Das Pattern MVVM für sich würde ich sagen hat geringe Lernhürden.
Dazu kommt aber die Einbettung, WPF hatte da deutlich mehr als das Pattern. In WinForms stelle ich es mir einfacher vor. Aber in WinForms sehe ich wie schon geschrieben die Motivation nicht. -
Haudruferzappeltnoch schrieb:
in Codeparadigma entsteht, weil auf die Aspekte a-e geschaut wird.
Man sollte jedoch auch prüfen, ob die Versprechen von diesem Codeparadigma auch erfüllt werden. Das Paradigma an sich ist wertlos. Aktuell lese ich ja hereaus, dass es was briningt. Vielleicht bin ich ja zu skeptisch.
-
Tags
-
Ähnliche Themen
-
10 Benutzer haben hier geschrieben
- Amelie (69)
- VaporiZed (67)
- ErfinderDesRades (21)
- Haudruferzappeltnoch (20)
- DTF (5)
- exc-jdbi (4)
- Amro (4)
- petaod (2)
- Coldfire (2)
- GerhardW (1)