Hallo,
Ich habe eine klasse an ein datagrid gebunden, die Klasse implementiert:
IEnumerable, IEnumerable<Test>, IList<Test>, INotifyCollectionChanged, IList.
Die zugrundeligende Liste mit der ich arbeite "ObservableCollection<Test> Items";
Ich kann problemlos Items entfernen und hinzufügen, es sei denn die Liste "Items" ist leer dann bekomme ich folgende fehlermeldung:> Fehlermeldung:
Das angegebene Argument liegt außerhalb des gültigen Wertebereichs.
Parametername: indexWeitere infos:
{System.Collections.ListDictionaryInternal}
{System.Object GetItemAt(Int32)}
Count = 0
Ich finde einfach keine lösung dafür.
Die Add methode die ich zum hinzufügen verwende ist die der IList:
public int Add(object value)
{
var @out = ((IList)Items).Add(value);
RaisePropertyChanged("Count");
RaisePropertyChanged("Items");
CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, value));
return @out;
}
Ich kann in diesem fall leider nicht von der ObservableCollection<Test> ableiten.
[Edit:
Es tritt auch auf wenn ich willkürlich element hinzufüge und entferne(Aber nicht immer).
Ich habe eine klasse an ein datagrid gebunden, die Klasse implementiert:
Was hast du denn gebunden?
IEnumerable, IEnumerable<Test>, IList<Test>, INotifyCollectionChanged, IList.
Die zugrundeligende Liste mit der ich arbeite "ObservableCollection<Test> Items";
Du hast 2 verschiedene Klassen? Wieso nicht die ObservableCollection<Test> verwenden, wenn die ObservableCollection all deine Interfaces bereits implementiert?
Stimmt, Ich hab ein wenig zu flach gedacht, *Ich hatte anfangs nicht die möglichkeit eine ObservableCollection zu verwenden weshalb ich die funktionallität selbst implementieren musste.
Ich hab einfachnich dran gedacht das DataBinding auf die Observablecollection zu setzten, sondern mich auf die Klasse versteigft 😄.
Danke.
Dennoch stellt sich die frage warum das Programm abstürtzt, laut MSDN ist die implementierung korrekt...?
Hi Robin0,
Dennoch stellt sich die frage warum das Programm abstürtzt, laut MSDN ist die implementierung korrekt...?
Wenn ich es richtig verstanden habe, stürzt nichts ab, sondern es wird eine Exception geworfen. Leider enthältst du uns vor, an welcher Stelle deine Implementierung die Exception geworfen wird. Ohne solche Informationen können wir da natürlich nur raten, siehe auch [Hinweis] Wie poste ich richtig?, Punkt 5: "Problem genau beschreiben - inkl. genauer Fehlermeldung - und konkrete Fragen stellen".
Ich würde anhand der Exception vermuten, daß die Ursache irgendwo in deiner INotifyCollectionChanged-Implementierung zu suchen ist, aber das läßt sich auch sehr einfach mit dem Debugger herausfinden: [Artikel] Debugger: Wie verwende ich den von Visual Studio?.
Ich würde zuersteinmal versuchen, die PropertyChanged-Ereignisse in einer anderen Reihenfolge auszulösen: Erst "Items", dann "Count". Sonst kann evtl. mit einem neuen (höheren) Index auf eine immer noch leere Collection zugegriffen wird.
Christian
Weeks of programming can save you hours of planning
Die exception wird im presentation framework geworfen genauer gesagt in "System.Collections.ListDictionaryInternal", nachdem ich mit der bearbeitung(Hinzufügen/entfernen fertig bin).
An der reihenfolge der INotifyPropertyChanged aufrufe liegt es leider nicht.
Zu dem genauen problem: Es wird eine exception geworfen, an einer stelle an der ich kein einfluss auf die Programmstabilität habe.
Ich denke es liegt am rückgabewert der Add methode denn das ist der einzige wert andem ich eine zahl zurückgebe.
Kann das sein, dass das eine interne, bereits behandelte Exception ist und Du das nur im Debugger siehst, weil Du den dazugehörigen Haken in den Exception-Einstellungen gesetzt hast?
Stürzt das jetzt immernoch ab, wenn Du direkt von ObservableCollection<Test> erbst wie es BlackMatrix gesagt hat?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Wenn ich die ObservableCollection verwende stürtzt das programm nichtmehr ab.
Ich kann nicht vonder ObservableCollection<Test> ableiten.
Ich kann in der datenbindung allerdings Path=Items angeben.
Dann scheints so, dass Deine Implementierung eben doch nicht der "echten" ObservableCollection entspricht.
Ob jetzt die MSDN hier auch einen Fehler gemacht hat in ihrer Vorlage oder Du ist nicht ersichtlich.
Warum solltest Du von ObservableCollection nicht ableiten können?
Tun doch andere Framework-Klassen ebenfalls. Und abstract ist diese auch nicht.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich hab schon eine andere Bassklasse aus dem grund kann ichnicht von der ObservableCollection<T> ableiten.