Zurück   Entwickler-Forum > .NET > .NET Framework allgemein

Antwort
 
Themen-Optionen Ansicht

Silverlight ListBoxItem.Tag
Alt 31.07.2010, 19:22   #1
Günther Weber
Stammgast
 
Günther Weber ist offline
Registriert seit: 26.02.2003
Ort: Hattingen
Beiträge: 1.110
Günther Weber befindet sich auf einem aufstrebenden Ast
Standard Silverlight ListBoxItem.Tag

Ein ListBoxItem ist das Element in einer ListBox.

Ein ListBoxItem hat die Eigenschaft Tag, der ich gern Daten zuordnen würde.

Jetzt könnte ich erst ein ListBoxItem definieren, Tag zuweisen, aber wo trage ich den Text ein, und wie kriege ich das Item in die ListBox?

Oder ich füge erst mit Add oder Insert den Text in die ListBox ein, aber wie komme ich dann an das ListBoxItem um nachträglich die Daten zuzuweisen?


In meiner Anwendung habe ich eine Liste, die in jedem Datensatz einen Hersteller, eine Typenbezeichnung und weitere Daten enthält. In einer ListBox sollen alle Hersteller, in einer weiteren alle Typen des in der ersten ListBox selektierten Herstellers aufgelistet sein. Um anschließend direkt auf den richtigen Datensatz zuzugreifen, möchte ich die Daten aus Tag auswerten. Nach einer Herstellerauswahl hätte ich einen Bereich (von - bis) aus dem ich alle Typen in die zweite Liste schreiben kann, bei einer Typenauswahl den genauen Index des gesuchten Datensatzes. Ansonsten müßte ich die gesamte Liste durchsuchen um den gewünschten Datensatz via Stringvergleich zu finden. Bei über 2800 Datensätzen dauert das etwas.

Danke
Günther
  Mit Zitat antworten

Anzeige

Alt 01.08.2010, 11:35   #2
fanderlf
Stammgast
 
fanderlf ist offline
Registriert seit: 18.07.2008
Beiträge: 1.339
fanderlf befindet sich auf einem aufstrebenden Ast
Standard

Warum baust Du Dir denn nicht eine entsprechende Datenstruktur auf und machst das ganze über DataBinding:

c# Code:
  1. public class Customer
  2. {
  3.   public String Name { get; set; }
  4.   public IEnumerable<CustomerType> Types { get; set; }
  5. }
  6.  
  7. public class CustomerType
  8. {
  9.   public String Name { get; set; }
  10.   public String Customer { get; set; } //optional - nur wenn du es bidirektional brauchst
  11. }

Wählt jemand einen Eintrag in der Liste aus hast Du auch direkt die passenden Typen und kannst die 2. ListBox füllen. Wenn Du eine Lazy Variante brauchst (also die Daten werden erst geladen, wenn jemand in ListBox Customer etwas auswählt), dann verwendest Du statt der CustomerType Objekte einfach nur die CustomerTypIds. So hast Du schnell alle Information zur Hand und musst nichts in ominösen Tag Properties speichern
  Mit Zitat antworten

Alt 01.08.2010, 12:11   #3
Günther Weber
Stammgast
 
Günther Weber ist offline
Registriert seit: 26.02.2003
Ort: Hattingen
Beiträge: 1.110
Günther Weber befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von fanderlf Beitrag anzeigen
Warum baust Du Dir denn nicht eine entsprechende Datenstruktur auf und machst das ganze über DataBinding:
weil so etwas noch zu neu für mich ist

Danke, ich werds auch bald können...
Günther
  Mit Zitat antworten

Alt 01.08.2010, 12:54   #4
Günther Weber
Stammgast
 
Günther Weber ist offline
Registriert seit: 26.02.2003
Ort: Hattingen
Beiträge: 1.110
Günther Weber befindet sich auf einem aufstrebenden Ast
Standard

Es handelt sich um Daten, die entsprechend dem Vorschlag von gfoidl aus diesem Thread http://entwickler-forum.de/showthread.php?t=63020 eingebunden sind. Allerdings eine andere Datei und ohne Datagrid. Wenn ich es richtig verstanden habe, müßte ich bereits diese Daten Deinem Vorschlag entsprechend speichern, da ich sonst unnötig Speicherplatz verschwenden würde. Das werde ich mit Sicherheit später noch tun.

Meine "langsame" Routine hab ich noch etwas beschleunigen können und spüre keinen Zeitunterschied mehr zwischen Klick und Rückmeldung, dass er richtig aussgewählt hat. Gestern war es so eine halbe Sekunde.

LG, Günther
  Mit Zitat antworten

Alt 01.08.2010, 22:50   #5
gfoidl
Stammgast
 
gfoidl ist offline
Registriert seit: 11.12.2007
Ort: Waidring / Tirol
Beiträge: 2.883
gfoidl befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

ich will das von Florian nochmal unterstreichen:
Zitat:
So hast Du schnell alle Information zur Hand und musst nichts in ominösen Tag Properties speichern
Wichtig ist die Trennung von UI und Logik. D.h. auch dass in der UI keine Daten gespeichert werden sollen und somit ist die Tag-Eigenschaft auch nicht zu verwenden.

Mit irgendeinem Muster wie MVC, MVP, MVVM (sind alle irgendwie ähnlich) lässt sich das mit Datenbindung wunderbar umsetzen. In der UI muss und soll nichts durch irgendwelche Klimmzüge gespeichert werden. Siehe dazu auch das Beispiel im obigen Link. Da wird alles per Bindung bewerkstelligt.

Warum ist Trennung von UI und Logik überhaupt sinnvoll?
Um keine ausufernde Antwort zu geben sollte der Hinweise auf "Trennung der Anliegen" reichen Ich könnte auch schreiben da es sonst keine sauberer Entwurf ist.


mfG Gü
__________________
"Programming today is a race between the programmers and software engineers to create better
and more idiot-proof programs, and the universe, creating bigger and better idiots. So far,
the universe is winning". - Rich Cook
  Mit Zitat antworten

Alt 02.08.2010, 09:33   #6
Günther Weber
Stammgast
 
Günther Weber ist offline
Registriert seit: 26.02.2003
Ort: Hattingen
Beiträge: 1.110
Günther Weber befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von gfoidl Beitrag anzeigen
Warum ist Trennung von UI und Logik überhaupt sinnvoll?
Das sehe ich ja schon selbst, wenn ich mir meinen Windows-Form Quelltext anschaue und nachdenke, welche Teile man wohl relativ einfach direkt in die Silverlight Anwendung übernehmen könnte.
  Mit Zitat antworten

Alt 02.08.2010, 09:43   #7
fanderlf
Stammgast
 
fanderlf ist offline
Registriert seit: 18.07.2008
Beiträge: 1.339
fanderlf befindet sich auf einem aufstrebenden Ast
Standard

Das blöde an der ganzen Geschichte ist, dass mans leider meistens erst viel zu spät merkt, wenn nicht jemand da ist der einen zwingt es so zu machen. Glaub auch bloß nicht, dass es super einfach wäre so eine Architektur aufzuziehen. Das Problem an der Sache ist nämlich, dass man eher in Objekten denken muss. Nicht mehr so nach dem alten Schema: "Zuerst mach ich das, dann mach ich das und dann mach ich das..."

Anfangs ist das ganze wirklich schwierig, weil man sich mit einer ganzen Flut an Themen auseinandersetzen muss. Aber je weiter man durchsteigt, desto mehr Spaß macht es so zu programmieren, weil man unglaublich flexibel wird.

Durchhalten ist die Devise!!!!
  Mit Zitat antworten

Alt 02.08.2010, 09:48   #8
Günther Weber
Stammgast
 
Günther Weber ist offline
Registriert seit: 26.02.2003
Ort: Hattingen
Beiträge: 1.110
Günther Weber befindet sich auf einem aufstrebenden Ast
Standard

So ein Programm hatte ich zuvor in C, ganz ohne Objektorientierung. Als ich es dann 2006 mit C# neu aufgebaut hatte, habe ich mich schon wahnsinnig gefreut, um wieviel übersichtlicher der Code geworden ist. Aber jetzt will ich es perfekt machen...
  Mit Zitat antworten

Alt 02.08.2010, 10:03   #9
fanderlf
Stammgast
 
fanderlf ist offline
Registriert seit: 18.07.2008
Beiträge: 1.339
fanderlf befindet sich auf einem aufstrebenden Ast
Standard

Perfekt geht eigentlich fast nicht das lerne ich auch bei jedem Projekt wieder. Ich denke mir auch bei jedem Projekt:
Oh das haste aber dieses mal schick gemacht. Und alles ist so toll und so elegant. Und ein halbes Jahr später wenn ich drüber schau fallen mir schon wieder 30 Sachen ein die man hätte besser machen können. Aber das geht wohl jedem so.
Wenn Dich das Thema wirklich interessiert möchte ich Dir mal folgende zwei Bücher ans Herz legen:

http://www.amazon.de/Domain-Driven-D...0736106&sr=8-1

http://www.amazon.de/Applying-Domain...0736106&sr=8-3

Diese Bücher beschreiben die Basisprinzipien gut organisiert Software. Diese Bücher sind interessant egal welche Software man schreibt.
  Mit Zitat antworten

Alt 02.08.2010, 10:18   #10
Günther Weber
Stammgast
 
Günther Weber ist offline
Registriert seit: 26.02.2003
Ort: Hattingen
Beiträge: 1.110
Günther Weber befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von fanderlf Beitrag anzeigen
c# Code:
  1. public class Customer
  2. {
  3.   public String Name { get; set; }
  4.   public IEnumerable<CustomerType> Types { get; set; }
  5. }
  6.  
  7. public class CustomerType
  8. {
  9.   public String Name { get; set; }
  10.   public String Customer { get; set; } //optional - nur wenn du es bidirektional brauchst
  11. }
Name in Customer wäre der Herstellername, das ist die erste Spalte meiner CSV Datei.

Name in CustomerType wäre die Typenbezeichnung, das ist die zweite Spalte in meiner CSV Datei. Die Datenbindung sieht dann vermutlich so aus: (werde ich heute Nachmittag so ausprobieren)

Code:
private void BindListBox()
{
  listBox1.DataSource = NameDerCustomerListe;
  listBox1.DisplayMember = "Name";
}
Die zusätzlichen Daten, also die restlichen Spalten der CSV Datei könnten direkt in CustomerType gespeichert werden. Das wäre die Speicherplatz sparende Variante.

Dann soll aber später noch ein Filter dazukommen, damit der Anwender nur bestimmte Typen angezeigt bekommt. Würde doch bedeuten, daß ich in dem Moment diese Listen neu aufbauen muß. Dann habe ich also die CSV Datei im Arbeitsspeicher und zusätzlich diese Listen, die dann allerdings ohne die zusätzlichen Daten. Oder kann man in beiden Klassen ein bool Feld hinzufügen, und "Name" nur dann in der ListBox zulassen, wenn dieses Feld true ist?

Danke - Günther
  Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu



Alle Zeitangaben in WEZ +2. Es ist jetzt 03:54 Uhr.



© 1995–2009 Software & Support Verlag GmbH. Vervielfältigung nur mit Genehmigung des Verlags.