| 

.NET C# Java Javascript Exception

1
Also ich habe folgendes Problem. Ich möchte daten aus meiner Datenbank in mein ViewModel laden und an die gebundenden Felder weitergeben. Im gleichen ViewModel sende ich aber auch die Daten an die Datenbank. Ich finde nur beispiele wo jeweis eine Maske zum erzeugen der Daten und eine Maske zum anzeigen der Daten benutzt wird. Meine Daten Lade ich schonmal in eine Collection nur weiss ich im Moment nich wie ich nun diese Daten in die jeweiligen Textfelder bekomme.

In Richtung Datenbank funktioniert alles wunderbar. Nur umgekehrt halt nicht.
News:
05.09.2011
Jens79 85 1 5
1
Vielleicht kannst Du Dein Problem mit ein paar Codesnippets präzisieren (1-2 Properties, Load/Save, Collection, Mini XAML ..).
ffordermaier 05.09.2011
5 Antworten
1
Hier ein paar Snippets wie gefordert ;-)

Textbox wie folg gebunden

<TextBox x:Name="TextBox" Text="{Binding Text, Mode=TwoWay}"/>
usw.

Im ViewModel
BeispielContext ctx = new BeispielContext;
Datensatz dt = new Datensatz;

public string Text
{ get { return dt.xyz; }
set [ dt.xyz = value;}
usw.
Methode bzw. ein Command löst dann dies hier aus

ctx.Datensatzn.Add(dt);
ctx.SubmitChanges();
das funktioniert auch wunderbar.

um dann die Daten empfangen zu können habe ich dann
eine Klasse erzeugt

DatenCollection:ObservableCollection<Datensatz>
{
}

wieder zurück im ViewModel

_datenCollection = new DatenCollection();
var cvs = new CollectionViewSource();
cvs.Source = _datenCollection;
_datenCollectionView = cvs.View;

public Datensatz CurrentDatensatz
{
get { return _datenCollectionView.CurrentItem as Datensatz; }
}

public ICollectionView Datensaetze
{
get { return _datenCollectionView; }
}

public void Loaddaten()
{
ctx.Load(_kctx.GetDatensatzQuery()).Completed += new EventHandler(ViewModelCompleted);
}

void ViewModelCompleted(object sender, EventArgs e)
{
foreach (Datensatz daten in ctx.Datensatzs)
{
_datenCollection.Add(new Datensatz());
}


}
05.09.2011
Jens79 85 1 5
0
Was ich in deinem Code vermisse ist das Implementieren der INotifyPropertyChanged-Schnittstelle
Das sorgt dafür, dass ein gebundenes Steuerelement aktualisiert wird.
05.09.2011
Jürgen Luhr 7,1k 2 9
0
Die habe ich aber implementert habe ich nur im Snippet vergessen wie ich gerade geshen haba
05.09.2011
Jens79 85 1 5
Jens79, bitte nutze die Kommentarfunktion für solche Anmerkungen und editiere Deine Frage statt neuer Antowrten zu geben, sonst verliert man hier schnell den Überblick.
ffordermaier 05.09.2011
0
Also, soweit Dein Snippet der Realität entspricht, sehe ich ein Problem im Binding. Du bindest die Textbox an die Text Property im ViewModel, die wiederum eine xyz Property Deines Datensatzes dt repräsentiert, der "irgendwo" mit 'new' erzeugt aber nicht mehr aktualisert wird. Deine Property CurrentDatensatz liefert aber den derzeitigen Datensatz deiner CollectionViewSource zurück, der nicht in dt abgelegt wird. Entweder Du speicherst den aktuellen Datensatz im Member dt oder Du bindest deine Textbox an den CurrentDatensatz statt an dt. Das Problem scheint in der Mehrdeutigkeit des "aktuellen Datensatzes" zu liegen.

Viel Erfolg,
Florian
05.09.2011
ffordermaier 8,4k 3 9
hast du dazu mal ein snippet ??
Jens79 05.09.2011
Probiers mal mit
<TextBox x:Name="TextBox" Text="{Binding CurrentDatensatz.xyz, Mode=TwoWay}"/>. Offen ist noch, wie Du die Navigation in den Datensätzen mit der CollectionViewSource abgebildet hast. Sofern die Property CurrentDatensatz den aktuellen Datensatz liefert, sollte das von mir vorgeschlagene Binding funktionieren.
ffordermaier 05.09.2011
0
Evlt. hast Du einen Vertipper in der Implementierung des von Jürgen angesprochenen Interface INotifyPropertyChanged !?

Beispiel:
public Payment SelectedPayment
{
get { return selectedPayment; }
set
{
if (selectedPayment != value)
{
selectedPayment = value;
RaisePropertyChanged("SelectedPaymen");/ /heir its ien fheler dirn
}
}
}


Edit 1:
Ebenfalls eine Fehlerquelle beim Implementieren des Interface ist das aufrufen des INotifyPropertyChanged Events BEVOR der Setter gesetzt wird.
Beispiel:
public Payment SelectedPayment
{
get { return selectedPayment; }
set
{
if (selectedPayment != value)
{
RaisePropertyChanged("SelectedPayment");
selectedPayment = value;
}
}
}
06.09.2011
Jorgen Schumann 1,6k 2 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH