Laden...

Designproblem bei DataBinding

Erstellt von antoschka vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.090 Views
A
antoschka Themenstarter:in
371 Beiträge seit 2007
vor 14 Jahren
Designproblem bei DataBinding

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:

  • teilweise bekomme ich die ClassA instanzen und müsste bei jeder schauen ob das Element schon da ist => dann würde ich auf Veränderungen des Elements lauschen; wenn es nicht da ist müsste ich acht geben wenn es hinzugefügt wird und mich dann dran binden
  • Ob die Instanz von ClassB in der Collection das gesuchte ist, hängt noch von anderen Eigenschaften der Instanz ab (in Wahrheit gibt es noch mehr), wenn diese sich ändern müsste ClassA ebenfalls informiert werden

Fällt Euch eine elegantere Lösung ein.

besten Dank

antoschka

2.187 Beiträge seit 2005
vor 14 Jahren

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.

  • keine Delegaten
  • sortierte List<> oder ein Dictionary<,> mit dem Type-String als Key.

Gruß
Juy Juka