Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Binding eine Spalte von einer DataTable
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 277

Themenstarter:

Binding eine Spalte von einer DataTable

beantworten | zitieren | melden

Hallo Liebe Community,

ich hab das Problem, das ich mehrere DataTables in meinem ViewModel habe, dieses dann dem DataContext zuweise und nun gerne einzelne Spalten aus einzelnen Tabellen auf TextBoxen binden möchte (via Xaml).

Ist das möglich? Hat jemand damit Erfahrung?

Ich hab schon viel beim Googlen gefunden, aber bisher hat nichts funktioniert.

Bsp:
Text={Binding Source = Kunde, Path = Rows[0][LASTNAME0]}

Grüße
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.977

beantworten | zitieren | melden

Du solltest dir ganz dringend noch mal anschauen wie MVVM geht.

Das VM ist dazu da die Daten für den View aufzubereiten, da gehört auch zu die Daten aus der DataTable entweder als Property oder als Liste von VM's zu erstellen.
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 277

Themenstarter:

beantworten | zitieren | melden

Okay, werd ich machen, aber heißt das jetzt in erster Linie das es nicht geht?
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 872
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

Du solltest eine Klasse haben, die alle Spalten zur Verfügung stellt.
Du kannst dann zum Beispiel die Instanzen der Klasse im Konstruktor mit allen DataTables instanzieren. Das ist sauber und nachvollziehbar.
Gerade wildes XAML Binding führt zu Spaghetti-Code.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von weismat am .
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 277

Themenstarter:

beantworten | zitieren | melden

Hallo,

danke für die Antworten. Ich hab gestern leider eine Menge probiert und dadurch zuvor mein Grid ein neuen DataContext zugewiesen daher ging das ganze nicht.

Für alle die diesen Beitrag sehen und eine Lösung suchen :

Wenn ihr eine DataTable habt mit nur einem Eintrag (ist bei mir der Fall) dann einfach folgendes nutzen :

<TextBox Text="{Binding EuerDataTableName.Rows[0][EuerSpaltenName]}/>

Grüße
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Cashisclay am .
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.977

beantworten | zitieren | melden

Das ist aber keine Lösung, das ist gefrickel.
Wie gesagt lese dir nochmal genau durch was MVVM ist.
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 277

Themenstarter:

beantworten | zitieren | melden

Für mein Problem bzw. meine Frage ist das genau die Lösung die ich auch gesucht habe, das man das ganze eventuell anders angehen sollte und besser umsetzen kann, möchte ich nicht abstreiten, aber für meine Frage und jede andere die sich darauf bezieht, ist das erstmal eine Lösung.
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2.207
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

Hallo _Cashisclay,

es funktioniert, da hast du natürlich recht. Trotzdem solltest du dir zu 100% MVVM anschauen. Auch wenn es dein Problem nicht nach den ersten beiden Sätzen, die du liest, lösen wird, ist es langfristig besser. Das Problem an deiner Lösung ist, dass es entsteht, weil du es woanders schon "falsch" angegangen hast. Das hat FZelle aber schon gesagt. Wenn du das gleiche nun nochmal machen musst, greifst du wieder auf dein "gefrickel" zurück und machst es wieder so - weil es ja funktioniert.

Daher kann ich dir nur ans Herz legen den Tipp zu berücksichtigen und dir WPF mit MVVM anzuschauen. Für deinen Code ists sicher besser.

Gruss

Coffeebean
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 277

Themenstarter:

beantworten | zitieren | melden

Hallo Coffeebean,

danke für deine Antwort. Ich werd mir das zu Herzen nehmen und mir das wirklich noch einmal ansehen. Ich kann deine Punkte zu 100% nachvollziehen. Ich hab auch schon FZelle verstanden, nur ist es immer das gleiche, ich versteh das man das Problem an der Wurzel packen möchte, aber jetzt in dem Moment habe ich eine Lösung zu dem Problem gesucht, aber FZelle als Beispiel hat 0,0 auch nur im Ansatz versucht darauf einzugehen, falls er denn darin Erfahrung hat.

Er hat wie so viele im Forum einfach die komplette Frage überworfen und unterm Strich meine Fragestellung irgendwo ignoriert .. "Ah, der macht das falsch ... Hier guck dir MVVM mal ordentlich an."

Ja, nice. Hilft mir in der Situation zwar 0 weiter, aber danke.
private Nachricht | Beiträge des Benutzers
t0ms3n
myCSharp.de - Member



Dabei seit:
Beiträge: 314

beantworten | zitieren | melden

Zitat von _Cashisclay
Ja, nice. Hilft mir in der Situation zwar 0 weiter, aber danke.

Doch, weil es dein Problem zu 100% löst.
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

MVVM studieren ist sicher nicht verkehrt.

Ist nun die Frage, ob MVVM hier nicht schon umgesetzt ist.
Weil er bindet ja an ein Viewmodel - es ist halt eine DataTable.

Und die stellt ja bereits Properties bereit - zumindest wenns eine typisierte DataTable ist.
Was aber im Xaml auch so gut wie keinen Unterschied macht - das Binden sähe fast identisch aus:
ob nun so (untypisierte DataTable):
<TextBox Text="{Binding EuerDataTableName.Rows[0][EuerSpaltenName]}"/>

oder so (typisierte DataTable):
<TextBox Text="{Binding EuerDataTableName.Rows[0].EuerSpaltenName}"/>

oder so (zwischengeschobene Viewmodel-Auflistung):
<TextBox Text="{Binding EuerDataList[0].EuerPropertyName}"/>
Nur im letzten Fall wäre ein sehr komplexes Viewmodel zwischengeschoben.

Es ist nämlich überhaupt nicht trivial, eine DataTable in eine Viewmodel-Auflistung zu wrappern. Weil es tritt (mal wieder) das Problem doppelter Listenführung auf (Liste im Model, aber auch Liste im Viewmodel) - ein KernProblem von MVVM.
(Eigentlich müsste dafür eine generische Lösung machbar sein, aber bekannt ist mir da nix)
Ja, kann man natürlich leicht einfordern vom TE, wenn man sowas nicht selbst umsetzen muss.

Oder kann jemand vlt. auf ein Beispiel verlinken, wo eine DataTable in ein Viewmodel integriert ist - das man mal konkret angucken kann, was das bedeutet?
Dieser Beitrag wurde 6 mal editiert, zum letzten Mal von ErfinderDesRades am .
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.977

beantworten | zitieren | melden

Ich hatte neulich bei eurer Diskussion keine Lust etwas zu schreiben, aber der View sollte
niemals auf etwas zugreifen was außerhalb des/der ViewModels ist.

Es ist auch wirklich kein Aufwand mal eben ein Property zu machen ( hat man ja snippets für, oder?)
und auch einzelne VM ( ItemTemplates ) lassen sich in Sekunden erzeugen.

Aber wenn man immer stundenlang nach Lösungen sucht wie man da drum herum kommt dann verschwendet man Zeit und vor allem Les- und Testbarkeit.

Denn das ist es was MVVM bedeutet.
Spagettiecode braucht sowas natürlich nicht.

Speziell wenn man wie _Cashisclay einen einzelnen Wert aus einer DT an die View binden will ist doch so ein 5 Zeiler echt schnell geschrieben, statt jetzt insgesamt 2 Tage dran zu laborieren.


public string DerSpaltenName
{
    get{ return EuerDataTableName.Rows[0][EuerSpaltenName] as string;}
    set{ EuerDataTableName.Rows[0][EuerSpaltenName] = value; OnPropertyChanged(null);}
}
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3.003
Herkunft: Thüringen

beantworten | zitieren | melden

MVVM in WPF Part II

bzw einzelne benötigte Properties eben über den Weg kapseln, den FZelle beschrieben hat.

Allerdings müsste mir mal jemand überzeugend einen Anwendungsfall zeigen, wo DataTable bei WPF mit MVVM ein geeigneter Container wäre. "Gefrickel" trifft es schon ganz gut.

LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

Zitat von FZelle
aber der View sollte
niemals auf etwas zugreifen was außerhalb des/der ViewModels ist.
naja - wer sagt, dass die DataTable ausserhalb des Viewmodels ist?
Ich sag, sie ist darinnen.

Dein PropertyWrapper berührt auch nicht das Problem der doppelten Listenführung.
Etwa die DataTable befüllen - wie ist da das Konzept?

Wenn man eine typDataTable (die ist ja bereits ein Wrapper um eine untypisierte) befüllt, kann man daran binden.

Wenn du einen Wrapper hast, musst du nach Befüllung erstmal alles umfüllen (genaugenommen musst du eine Viewmodel-Liste generieren, die aus den SubModels der Model-Liste lauter SubViewmodels generiert - also ist mehr als Umfüllen).

Und wenn der User in die Zufügezeile was zufügt - oder mit Entf-Taste was löschst - DataTable kann das, aber mit einem Wrapper - jo, musste erstmal was für bereitstellen.

Und per Code muss natürlich auch zugefügt und gelöscht werden, und wg doppelter Listenführung müssen immer beide Listen angesprochen werden - wie soll das vor sich gehen?

Edit: @Latino:
Nur kurz überflogen, aber scheint mich bisher zu bestätigen:
Das dortige MainViewmodel hat eine Property FileData vom Typ DataTable, und daran wird gebunden.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von ErfinderDesRades am .
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 277

Themenstarter:

beantworten | zitieren | melden

Zitat von FZelle
Speziell wenn man wie _Cashisclay einen einzelnen Wert aus einer DT an die View binden will ist doch so ein 5 Zeiler echt schnell geschrieben, statt jetzt insgesamt 2 Tage dran zu laborieren.

Ich entnehme 26 Spalten aus der DataTable und wollte mir nicht für jede einzelne Spalte eine einzelne Property anlegen.
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3.003
Herkunft: Thüringen

beantworten | zitieren | melden

Zitat von ErfinderDesRades
Nur kurz überflogen, aber scheint mich bisher zu bestätigen

Hab' offenbar deine Frage falsch verstanden. Ich komm aber bei deinen Ausführungen insgesamt nicht ganz mit, ehrlich gesagt. Du stehst immer wieder und sehr vehement auf dem Standpunkt, dass "doppelte Listenführung" sehr komplex sei, Aufwand bedeute und in vielen Fällen grob gesagt einfach zu teuer sei. Was für eine doppelte Listenführung?!
Ein Adapter hin, ein Adapter zurück.

Wozu sollte ich bitte eine Liste der (non-UI-)Models halten, außer, um mir Arbeit mit der Synchronisation der Listen zu machen?

LaTino, verwirrt
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LaTino am .
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

Das sind 2 Aussagen
1) Du sagst, doppelte Listenführung sein kein Aufwand. 2 Adapter halt. Aber das Hinzufügen eines ViewSubmodels erfordert die Instanzierung eines SubModels, und wie das ViewSubmodel in die ViewSubmodel-Liste getan werden muss, so muss parallel dazu das SubModel in die SubModel-Liste getan werden.
Und Löschen grad andersrum.
Das geht bischen über Adapter hin - her hinaus.
Kann sein, du schreibst das in 10min - ich jdfs. finde das nicht-trivial.

2) Du sagst, doppelte Listenführung brauche man nicht. Ja, du sagst ja auch, eine Datatable brauche man nicht, ja ok, dann hast du recht.
Insbesondere in diesem Fall hast du recht, wo der TE eh nur eine einzige DataRow zu nutzen scheint.
Jedenfalls wenn man eine Datatable braucht, und Wrapper schreibt für die DataRows, dann braucht man auch eine Liste, wo man die Wrapper auflisten kann, weil in die DataTable kann man die Row-Wrapper ja nicht tun.
Und dann hat man eine Liste von RowWrappern, und halt die DataTable, was ja eine Auflistung von DataRows ist.

Ist das verständlich?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ErfinderDesRades am .
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
Palin
myCSharp.de - Member



Dabei seit:
Beiträge: 1.090

beantworten | zitieren | melden

Also wenn ich eine DataTabel, direkt an eine View Binde, habe ich das Model (Daten in Objekt Darstellung. Egal woher sie jetzt kommen) direkt an die View gebunden.

Was eigendlich nicht die Idee des MVVM Patterns ist.

Für einfache Anwendungen (die im Zweifel einfach komplett neu geschrieben werden können), ist das durchaus ein Sinnvolles vorgehen. Grundlegend brauche ich da auch so gut wie keine Zeile Code zu schreiben. Im VS kann ich die Tabel als Datenquelle hinzufügen und dann als Listen/Detail im Desiner Ansicht auf die View ziehen. Kein Problem und sehr schnell gemacht.

Bei größeren Anwendungen, die über Jahre Existieren und du gegebenen Falls mehrfach die UI oder den DAL austauschen musst. Sollte man es vermeiden.
Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern
private Nachricht | Beiträge des Benutzers
Papst
myCSharp.de - Experte



Dabei seit:
Beiträge: 423
Herkunft: Kassel

beantworten | zitieren | melden


Nur weil nach einem Anwendungsfall gefragt war:
Klassischer Anwendungsfall für das Binden einer DataTable direkt an die Oberfläche wäre das darstellen von Logdaten in Tabellenform.
Hier würde aber nicht ein Teil der Tabelle gebunden werden sondern die gesamte Tabelle als DataView, bietet sich vor allem dann an, wenn vom eingelesenen Log abhängt wie die Formate sind und das beim Design des Programms nicht bekannt sein muss/ist.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.977

beantworten | zitieren | melden

Sorry, aber ich persönlich halte überhaupt nichts von DataTables, da sie nicht typisiert sind und deswegen das gefrickel fördern.
Und eine typisierte DataTable ist nur gefrickel über gefrickel.

Was ist so verd... schwer daran mal in 2 Minuten eine Klasse zu schreiben die die Daten in nativer Form hält?
Die kann man genau so zum visuellen DataBinding benutzen, die ist viel leichtgewichtiger, testbar usw.

Statt immer wieder mit dem Frickelkram zu arbeiten, sich ständig irgendwas ausdenken zu müssen um das irgendwie hinzubekommen, macht man es doch lieber gleich richtig.
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

Hier hab ich mal son Gefrickel-Gefrickel.

Ein kleines Warenhaus mit Artikel, Kategorien und Lieferanten.

Vollständiger Crud-Support aller Datensätze, m:n - View in beide Richtungen, Laden, Speichern und die Daten sind auch im Zip enthalten.
"m:n - View in beide Richtungen" bedeutet:
1) Ansicht der Artikel (einschließlich Lieferant) nach Kategorien
2) Ansicht der Artikel (einschließlich Kategorie) nach Lieferanten
Mittels ComboboxColumn kann dem Artikel eine andere Kategorie/Lieferant zugeordnet werden.

Ich lade dich ein, das eben mal umzuschreiben, dasses kein "Gefrickel" mehr ist.
Vorzugsweise ohne dass ich groß was nach-installieren müsste, also IOC, SqlServer, Prism etc. - ist bei mir immer ein Unsicherheitsfaktor, ob ich das gebacken kriege.

Edit:
Bitte an die Moderation: Kann man die Diskussion "doppelte Listenführung" etc. abtrennen?
Imo ab dem Post von 13:58 wird hier verhandelt, was der TE garnet gefragt hat, und sein Thema hatte er ja selbst gelöst, schon um 10:10.
Dieser Beitrag wurde 5 mal editiert, zum letzten Mal von ErfinderDesRades am .
Attachments
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3.003
Herkunft: Thüringen

beantworten | zitieren | melden

Hab's mir mal angeschaut. Dein ViewModel ist keines. Die Steuerung der UI wird direkt vom Datenmodell (und ich rede nicht vom ersten "M" in MVVM) übernommen, das "ViewModel" weiß zu keiner Zeit vom Zustand der UI, dafür führt es aber Aufgaben aus, die UI-Sache sind (System.Media.SystemSounds.Asterisk.Play();) - das geht selbst über meine recht freie Definition von MVVM weit hinaus. Na klar funktioniert das. Aber du hast genau gar keine Schichtentrennung.

LaTino
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LaTino am .
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

ja, ich weiß - alles ganz schrecklich - ein grauenhaftes Gefrickel von 30 Zeilen Code leistet die genannten Features:
Voll-Crud im bidiraktionaler m:n-View, laden und speichern, und TestDaten sind auch gleich mit drin.

Ich wollte mal sehen, wie ihr das "besser" macht, das ist der Punkt - könnt ihr das, und wird das Ergebnis - wenn ihr die Herausforderung überhaupt annehmt - mich auch überzeugen?

ZB - wenn man da ein richtiges Viewmodel zwischenschiebt, ich denke, da steht man dann vorm Problem der doppelten Listen-Führung.

Beachte auch, dass mein Sample auch als MVVM bezeichnet werden könnte. Zumindest was du als MVVM-Artikel verlinkt hast, ist kein Deut besser - dort wird auch an eine DataTable gebunden.
Und was da als "Model" bezeichnet wird ist keines, sondern ist ein Repository.
Weil imo ists ein Unterschied, ob etwas Daten heranschafft, oder ob wirklich Zusammenhänge modelliert sind.

PS:
"gar keine SchichtenTrennung" findich doch ein krass übertriebenes DownRating. Die View ist absolut klar getrennt vom anderen.
Nur Model, Viewmodel, Repository sind nicht ausdifferenziert.
Wenns am SystemSounds.Play() liegt - dann lösch die Zeile.
Oder sieh's als Provisorium - klar kann man da nu Dateien anlegen, WeakEvents einrichten, auslösen, in anderen Klassen dann empfangen - dass es am ende doch nur wieder "Plink!" macht.
Es deutet halt an, dass ein Feedback wünschenswert ist, wenn ein Speicher-Vorgang erfolgreich war.
Ich finde nicht, dass die Trennung von View und Model steht oder fällt, nur weil ich das in einer Zeile abhandle.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ErfinderDesRades am .
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3.003
Herkunft: Thüringen

beantworten | zitieren | melden

Nein, du hast einen View, den du per Databinding an ein fertiges Datenmodell bindest. Das heisst du benutzt Databinding, ja. Das war's aber auch, die Trennung von der UI wird ausschließlich durch das Binding erzeugt, nicht etwa dadurch, dass Schichten existieren würden.

Du kannst gern den Overhead, den das DataSet/DataTable erzeugt, mit zu den 30 Zeilen Code zählen. (EDIT: hätte ich anders formulieren sollen. Sagen wir so: da du kein funktionales MVVM implementierst, sind deine M/VM-Klassen sehr kurz, das ist wahr. Sehr kurz ist in deinem Beispiel auch, was weiß ich, sagen wir, der Part mit der schachspielenden KI. Das heisst aber nicht, dass es ein gutes Beispiel für eine schachspielende KI ist ;) )

Und nein, dein VM ist nicht nur nicht ausdifferenziert, es ist nicht existent. Gebunden wird die UI direkt an eine Eigenschaft der "MainViewModel"-Klasse. Ein ViewModel bildet aber die UI (und deren Workflows!) ab und dient ihr nicht bloss als Container für die darzustellenden Daten.

Das Projekt hat vom MVVM-Part nur den View, nicht mehr. Dann könnte ich dir auch einen Football in die Hand geben und sagen "zeig mal, wie du damit ohne Aufwand Golf spielen willst!".

Die Trennung von View, Model und ViewModel steht und fällt damit, dass jeder Part klar formulierte Aufgaben hat. Diese Aufgaben sind innerhalb des MVVM-Patterns klar definiert. Wenn du sie ignorierst (und das tust du), kannst du nicht einfach eine Klasse "MainViewModel" nennen und dann behaupten, du hättest ViewModel. D.h. du kannst das schon machen, es hat nur nichts mit dem Thema MVVM zu tun.

Noch ein Edit: Um das zu veranschaulichen: sagen wir, du willst deine UI wirklich steuern. Simples Beispiel - eins der DataGrid soll vorsortiert sein. Dein "MainViewModel" weiss aber gar nichts darüber. Es muss im Gegenteil mangels Model direkt in das Datenmodell greifen. Zum einen, wäre es MVVM, sollte das VM das Datenmodell nicht kennen. Zum zweiten sollte es selbst die Prozesse der UI abbilden. Tut es beides nicht. Die dargestellten Daten sind nicht im Scope des Oberflächen-Entwicklers, sondern des Daten-Entwicklers. Letzterer hat damit auch, ohne es zu wissen, die Kontrolle darüber, wie die Oberfläche aussieht. Das riecht nach Ärger.


LaTino
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von LaTino am .
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

Das ist doch jetzt Wortklauberei.

Immerhin erkennst du, dass ich ein View habe. Und du erkennst, dass da noch etwas anderes ist.
Von dem ich ja selbst sage, es ist nicht ausdifferenziert. Ich hab nun leider kein Wort dafür: wenn ich es Model nenne, widersprichst du mir, wenn ich es Viewmodel nenne widersprichst du mir auch.

Den DatasetDesigner-Code zähle ich nicht zum UserCode, denn ich habe ihn nicht coden müssen.
Um die Anwendung zu verstehen muss man den DesignerCode auch nicht angucken, sondern man muss den DatasetDesigner angucken, um das Datenmodell zu verstehen, das MainWindow um die Oberfläche zu verstehen, und die MainViewmodel-Klasse, an die die Oberfläche gebunden ist.
Und darin habe ich kaum 30 Zeilen Code schreiben müssen, für diese Anwendung.

Aber ich hab den Eindruck, man ziert sich, die Herausforderung anzunehmen, und eine ebenfalls eine praktische Umsetzung anzubieten, dass man mal gucken kann, wie MVVM "richtig" geht.
Hat man natürlich gut reden, aber das sind nur Reden.

Ich hab übrigens auf Codeproject noch weiter herumgesucht, nach einem MVVM-Artikel, wo überhaupt mal ein Model auftaucht, was eine Liste enthält - bislang keins gefunden.

hier: http://www.codeproject.com/Articles/278901/MVVM-Pattern-Made-Simple gibts überhaupt kein Model - noch weniger als bei mir.

hier: http://www.codeproject.com/Articles/165368/WPF-MVVM-Quick-Start-Tutorial besteht das "Model" aus einer Song-Klasse, es gibt keine Interpreten, keine Alben, und logisch sind auch keine Zusammenhänge modelliert - nichtmal eine Auflistung von Songs gibts im Model.

Jo - mit so Primitiv-Models sieht MVVM dann schmissig aus, und hat auch kein Problem mit doppelten Listen.
Aber mir kommt das vor wie Drückebergerei bzw. auch ein die Augen vor etwas verschließen
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3.003
Herkunft: Thüringen

beantworten | zitieren | melden

Ich sagte ja, kann man machen, und funktioniert auch. Nur ist es, wie du sagst, eine schwammige Trennung der Verantwortlichkeiten, und ganz sicher, wie ich begründet habe, keine MVVM-Implementierung. Die DataSet/DataTable-Geschichte ist sicherlich bequem - weil sie ursprünglich entworfen wurde, um genau das zu machen, was du gemacht hast (zwar in Windows.Forms, aber - geschenkt). Was erwartest du jetzt? Dass ich oder jemand anders dein Projekt auf MVVM umzieht, und so lange vergrößert, bis von dir ein "okay, jetzt ist der Aufwand für MVVM gerechtfertigt" kommt? Wozu sollte das gut sein (außer, dass jemand sein Wochenende verschwendet)? Und wenn es dann 20 Zeilen länger ist, diskutieren wir darüber, dass MVVM viel zu aufwändig ist, und ignorieren dabei völlig den Fakt, dass der Sinn von Schichtentrennung nicht ist, weniger Code zu produzieren, sondern besser managbaren Code zu produzieren? Also, was wäre damit bewiesen?

Netter Versuch mit dem "man ziert sich". Die Abwägung zwischen Freizeit und einem kurzen "achso, aber..." von dir ändert sich aber nicht dadurch ;). Dir ist doch völlig klar, dass die Lösung in deinem Projekt quick&dirty ist (siehe auch den Beitrag von Palin, da ist an sich nix hinzuzufügen). Also muss dir auch niemand beweisen, was du schon weißt.

LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

naja, die Lösung ist nicht quicker und dirtiger als in allen MVVM-Tuts, die mir bekannt sind.

Mir zu beweisen, was ich schon weiß - da hab ich tatsächlich kaum was von. Was ich erwarten täte? Naja, euch beim Wort nehmen halt. Ihr wisst so toll, wie "richtiges" MVVM geht, aber mal ein Beispiel vorlegen, so wie ich es tue, - da kommt dann nixme.

Aber vlt. sollte ich zwei Sachen auseinander halten: Also von FZelle ärgert mich, dasser "FrickelFrickel!" schimpft, und in 2 Minuten könne man es "richtig" machen.
Nur erbringt er keinen Nachweis dessen.

Bei dir ärgerts mich weniger - hätte mir halt erhofft, mal eine Lösung zu sehen, die aufzeigt, wie "richtiges" MVVM das im Viewmodel löst, wenn im Model eine Auflistung von SubModels auftritt, oder gar eine m:n-Relation.
Da drücken sich ja ausnahmslos alle mir bekannten Tutorials drum herum, und auch ihr scheint das Problem nicht sehen zu können.
Wenn Ihr's mal probiertet, vlt. würdet ihrs dann sehen. Oder aber es würde es mir etwas neues aufzeigen.
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von ErfinderDesRades am .
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3.003
Herkunft: Thüringen

beantworten | zitieren | melden

Weil's so schön ist und exakt meinen Punkt stärkt, kleine Zwischenmeldung.

- 10 Minuten für die UI-Modelklassen
...dann bau ich mir, was der Hauptpunkt ist, weshalb ich vor dem Beispiel zurückgeschreckt bin (du weisst, was ich vom DataSet-Designer halte, für alle anderen: das Ding ist wie Hitler, nur unsympathischer), also, dann baue ich mir einen DataProvider, der die Schnittstelle zwischen dem Dataset, dass ich als Datenmodell zu benutzen gedenke, und den UI-Modellklassen darstellt.

Stell' dir meine Überraschung vor, als ich feststelle, dass man mit deinem Datenmodell (z.B., nicht der einzige Defekt) gar nicht (sauber) einen Artikel von mehreren Lieferanten liefern lassen kann. Wir haben also ein defektes Datenmodell. Im MVVM-Normalfall wäre das völlig egal. In diesem Fall hier sorgt es dafür, dass ich selbst die Tabellen umstrukturieren muss, das Datenmodell ändern muss, am DataSet basteln darf (danke, vielen, vielen Dank)...oder alles wegwerfe und mir "fix" ein eigenes, funktionierendes Datenmodell baue.

Und deshalb ist das direkte Binden von Datenmodell an den View Mist.

LaTino
Edit, Disclaimer: die fehlende/falsche Relationsbehandlung kann passieren, und hätte mir auch selber sofort auffallen müssen. Darum geht's nicht :)

Edit: so, hängt dran. Anmerkungen:

a) ~60-70% der Zeit hat mich der DataProvider und die Korrektur des Datenmodells gekostet
b) das UI-Model unterstützt die Änderung der Relationseigenschaft "Preis" der Lieferant-Artikel-Relation, aber die UI tut das nicht. In plain language: das neue Datenmodell hat eine Relation Lieferant-Artikel (1:n), die eine Eigenschaft "Preis" hat. Das lässt sich mit einem GridView nicht ohne Weiteres oder wenigstens nicht ergonomisch abbilden, ich müsste im vierten DataGrid (r.u.) eine Combobox für den Artikel nutzen, die gleichzeitig Auswahl des Artikels und Editieren des Artikelnamens erlaubt. Das ginge zwar, widerspricht aber üblichen UI-Patterns. Ist aber ein anderer Aspekt, der nix zum Thema beiträgt, deshalb - weggelassen.
c) DataSet entfernt. Hab ich erwähnt, dass ich das Ding hasse? Mag sein, dass jetzt das Datenmodell schwerer nachzuvoollziehen ist (siehe Data\example.xml), dafür ist es korrekt.
d) Menü ist dysfunktional, da ich darauf keine Lust hatte und es auch nix zur Sache tut ;)
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von LaTino am .
Attachments
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.977

beantworten | zitieren | melden

@ErfinderDesRades:
Komisch, vor garnicht all zu langer Zeit ( wirklich schon wieder ein jahr ) habe ich dir mal privat und per Mail eine Demo für die Benutzung eines ORMappers gemacht.

Habe darin gezeigt wie man mal mit einem ORMapper statt DataSets arbeitet und lese trotzdem immer und immer wieder von Dir hier das du die untypisierten Monster immer noch benutzt.

Ansonsten hat LaTino alles geschrieben was dazu zu sagen ist.

Wenn du kein MVVM machen willst, schön für dich, behaupte aber nicht das du es tust ( machst du offensichtlich nicht ).
Und da du es nicht machst, kannst du ganz offensichtlich nicht beurteilen welche Vorteile in der Pflege einer immer grösser werdenden Software das bringt.

Wie gesagt, mach was du willst, aber behaupte nicht du machst MVVM.
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

naja - dann behaupte ich halt, ich mach so, wie in den mir bekannten MVVM-Artikeln von CodeProject gezeigt.
Wobei keiner dieser Artikel euren Ansprüchen an MVVM gerecht werden würde.
Artikel, die euren Ansprüchen an MVVM gerecht werden würden, sind mir leider nicht bekannt.

Oder vlt. doch, zB kam neulich ein VierGewinnt-Monstrum auf, zu dem ich notiert habe:
"Dieses ist ausse Dropbox gezogen, und steht im Zusammenhang mit einer utube-reihe/Vorlesung zu Wpf
https://www.youtube.com/watch?v=jOCrux6MJ7g
https://dl.dropboxusercontent.com/u/14810011/VierGewinnt.zip"


Ist vlt. wirklich ein gutes Beispiel, weils aufzeigt, wie umfangreich das ist, was ihr euch unter "richtigem" MVVM vorzustellen scheint.
Und besonders wartbar findich das nicht, sondern es enthält jede Menge Zeugs, was keine Funktion erfüllt, und entfernt gehörte.
Ausserdem gibts leider auch nichts her zur doppelten ListenHaltung: es gibts zwar Listen im Model, aber kein dynamisches zufügen/entfernen.

------------

Es sind übrigens typisierte "Monster" (Datasets), die ich verwende - keinesfalls untypisiert.
Jo, benutze ich immer noch. Weil typDataset als Datenmodell hat noch immer als Alleinstellungsmerkmal den Vorzug, das mans direkt auf Platte speichern kann, und keine Abhängigkeiten eingehen muss zu Zusatzbibliotheken, Datenbanken, Datenbank-Installations-Umgebungen etc..
Aber das Thema hat ja auch nix mit MVVM zu tun - Für MVVM ists doch egal, ob ein Model aus TypedTable<TRow> besteht oder aus LinqToDB.ITable<TEntity>
Auch dein gemailtes Beispiel hat nix mit MVVM zu tun - es ist ja eine WinForms-Anwendung.
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von ErfinderDesRades am .
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers