Hallo,
ich suche Rat wie ich eine Anforderung am besten lösen könnte. Folgendes Problem:
Ich habe zwei Klassen:
ClassA
{
public string Name{get; set;}
private List<ClassB> AttributCollection{get; set;}
}
ClassB
{
public int Id{get; set;}
public string Type{get; set;}
public string ValueString{get; set;}
}
Eine Collection von ClassA wird an einen GridView gebunden und in einer Spalte soll das Property Name angezeigt werden.
Name ist allerding nur als Property in ClassA enthalten, der Wert ermittelt sich aus dem ValueString eines bestimmten Element der AttributCollection (z.B. dem Element bei dem Type == "Name" ist).
Spontan sind mir zwei Lösungswege eingefallen die beide nicht so dolle sind.
1.
im getter von Name rufe ich ein Methode auf:
string getName()
{
AttributCollection.Find(ac=> string.Equals(ac.Type,"Name")).ValueString;
}
=> Performancesorgen!!!!
2.
ValueString wird um ein event "ValueStringChanged" erweitert und ClassA bindet sich an das Event des einzelnen Element in der AttributCollection. Wertänderungen in der Instanz von Class B würden in eine lokales Feld "name" übernommen. Das wäre glaueb ich ziemlich performant, da die Daten zum Zeitpunkt des Zugriffs bereits verfügbar sind.
hier gibt’s zwei Probleme:
Fällt Euch eine elegantere Lösung ein.
besten Dank
antoschka
Hallo antoschka,
Das ganze per Observer-Pattern zu lösen ist möglich.
Dazu solltest du deine List<> gegen eine BindingList<> oder ObservableList<> (ka, wie die genau heißt, benutze .Net2.0) austauschen, da diese ein Event auslöst wenn ein Element entfernt oder hinzugefügt wird. Dann muss die Klasse in der Auflistung noch INotifyPropertyChanged implementieren. So kannst du die Liste sicher überwachen.
Gegen die Lösung mit dem Find ist aber auch okey, man sollte es halt noch optimieren.
Gruß
Juy Juka