| 

.NET C# Java Javascript Exception

3
Hallo,
also ich habe derzeit folgendes Problem das mir unter den Nägeln brennt.
Ich habe eine Anwendung in einer MVVM Architektur. Einfach zusammengefasst ist es so, dass der Benutzer sich Datensätze anzeigen lassen kann zu... sagen wir mal Personen. Da es sich natürlich von Person zu Person immer um die selbe View handelt, führe ich die View als Instanz nur ein einziges mal und tausche eben immer nur den DataContext aus. Nun habe ich aber einige ComboBoxen auf meiner Oberfläche (verwende hier die von Telerik). Diese ComboBoxen haben als ItemsSoruce eine Bindung an eine Liste von Elementen mit sprechendem Namen und dazu gehörenden Datenbankwert. Der SelectedValue ist dann direkt an den Datensatz gebunden (kommt hierbei über LinqToSQL).
Wenn ich nun den DataContext wechsel (also von einer Instanz zu einer anderen, er wird NICHT auf null gesetzt!), habe ich das Problem das die ComboBox mir als Wert ein null reinsetzt, was dazu führt das wenn der Benutzer einen Datensatz aufmacht es direkt Ausstehende Änderungen gibt und sollte er jetzt speichern, würden nun auch alle Felder die von so einer ComboBox *gespeist* werden eben auch in der Datenbank auf Null gesetzt.

Ich verstehe nicht warum das passiert. Es scheint fast so, als würde die ComboBox das Bedürfnis haben ihren SelectedValue auf null zu setzten. Was ja auch passiert (debuger _> haltepunkt auf setter im linqschema und schlägt an) und eben dann auch in der Linq Klasse ankommt. Klar es ist durch aus gewollt das der Benutzer auch soetwas auswählen kann wie "Keine Angabe" und damit auch das Feld auf Null gesetzt wird, aber dies darf nicht passieren wenn ich den DataContext wechsel.

Ach das Problem tritt übrigens erst beim wechsel von einem auf den anderen Datensatz auf. Wenn der Benutzer die Anwendung startet und nur EINEN Datensatz aufruft ist alles okey.

Hat irgendjemand schon vor ähnlichem Problem gestanden und weiß mir Rat? Ich steh hier leider echt im Dunkeln :(

Vielen Dank schonmal dafür!
Chris
14.06.2012
ChrisFFM 33 4
3 Antworten
1
Das Problem liegt meines Erachtens im SelectedValue. Bei Veränderungen des DataContextes scheint sich die ItemsSource und damit die Liste der ComboBox zu erneuern. Dadurch verliert der SelectedValue seine Beziehung zur Liste und er wird auf NULL gesetzt. Versuch einfach, den SelectValue durch Heraussuchen mit LINQ aus der Liste wieder festzulegen.

SelectedValue = Liste<IDNameObjekt>.FirstOrDefault(p => p.ID == OldSelectedID)

Vielleicht bringt Dich das irgendwie weiter :)
21.06.2012
tominwien 26 1
Hat es, zumindest die Richtung, das Problem bestand darin, dass jeder DataContext eine eigene (wenn auch Gleiche) Liste für die cBox mit brachte. Nachdem ich nun als Quelle für die Liste eine Zentrale Sammlung verwende, funktioniert es.
ChrisFFM 22.06.2012
0
Hallo Chris,
welches MVVM Framework setzt Du ein?
In der Regel setzt man den DataContext in der View nur einmal, um die View an das ViewModel zu binden. Hierfür setzt man dann z.B. einen ViewModelLocator oder DI Frameworks wie Unity oder MEF ein.
Alles weitere passiert dann im ViewModel, in dem Du die Bindungen in der View über DataSource und ähnliche Attribute an die Eigenschaften in der VM bindest.
Wenn Du Änderungen in einer Eigenschaft im VM vornimmst und diese nicht an die View weitergegeben hast, dann wahrscheinlich weil Du das IPropertyNotification Interface nicht korrekt angebunden hast.
Wenn Du Dich aber an dern bekannten MVVM Frameworks wie Caliburn, MVVM light oder PRISM orientierst, sollte es in deren Bespielen zu sehen sein.
Dirk
14.06.2012
judgy 3,0k 8
1
Du kannst den Datacontext auch einfach per Hand an das ViewModel binden. per <Usercontrol.DataContext> <lokal:MeinViewModel> </Usercontrol.DataContext>. Weisst Du sicher, aber ich wollte es doch noch erwähnen.
Jens Duczmal 14.06.2012
0
Hallo Dirk und danke für die Antwort,
ich habe mir als Basis Cinch eingebunden, dass aber hier und da um ein paar Sachen erweitert.
Ich tausche den DataContext der View deswegen aus, weil ich nicht die View mehrfach instanzieren will. Warum Ressourcen verschwenden? Ich brauch die Oberfläche als Instanz nur ja nur einmal, da der Benutzer auch immer nur eine View sehen kann, DataContext austauschen und alles ist wunderbar. Zumindest bei allen Steuerelementen, außer eben den ComboBoxen, die da aus der Reihe tanzen. (Lustiger weise aber auch nicht alle wie ich inzwischen festgestellt habe)
14.06.2012
ChrisFFM 33 4
1
Dann versuche den Unterschied zwischen den ComboBoxen die funktionieren, und den anderen auszumachen. Irgendwo muss da ja etwas sein. Testweise würde ich die, die nicht gehen mal an dieselbe Datenquelle binden, wie die, die gehen. Falls das dann immer noch nicht läuft, liegts am XAML.
Jens Duczmal 14.06.2012

Stelle deine .net-Frage jetzt!