WPF und Linq: Rückgabe mehrerer Spalten des SelectedItems einer Listbox

  • WPF

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    WPF und Linq: Rückgabe mehrerer Spalten des SelectedItems einer Listbox

    Hallo,
    ich versuche gerade als WPF und Linq Neuling mich in die Technik einzuarbeiten und habe auch nach stundenlangem Rumsuchen keine Lösung gefunden:

    Ich habe eine WPF-Listbox, deren DataContext ich mit Linq to SQL gebunden habe.
    In der XAML ist die Listbox lediglich wie folgt deklariert:

    XML-Quellcode

    1. <ListBox x:Name="LBAPLieferanten" Height="337" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}" DisplayMemberPath="SPRUPARTNERSHORTNAME" SelectedValuePath="NUMBER001"/>


    "Gefüllt" wird die Textbox mit dem Code:

    VB.NET-Quellcode

    1. Dim APLieferanten = From Lief In DBBde.SPRAPLieferanten
    2. Order By Lief.NAME
    3. Where Lief.PATH001 = "AP"
    4. Select Lief.SPRUPARTNERSHORTNAME, Lief.NUMBER001, Lief.SEARCHSTRING
    5. LBAPLieferanten.DataContext = APLieferanten


    Ich möchte eigentlich lediglich noch im Code Zugriff auf den SEARCHSTRING haben. (NUMBER001 wird mir ja mit LBAPLieferanten.SelctedValue zurückgegeben.)
    Da aber ja LBAPLieferanten.SelectedItem ein anonymer Typ ist, kann ich nicht einfach auf SEARCHSTRING zugreifen. (Oder geht das doch?)

    Also habe ich versucht mit

    VB.NET-Quellcode

    1. Dim SearchStr = CType(LBAPLieferanten.SelectedItem, Lieferanten).SEARCHSTRING
    den Typ zu konvertieren, bekomme hier aber eine Fehlermeldung, da die Typen nicht gleich sind.

    Meine Klasse Lieferanten habe ich wohl zu einfach aufgebaut:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Lieferanten
    2. Private _NUMBER001 As String
    3. Private _Suchtext As String
    4. Private _Name As String
    5. Public Property SPRUPARTNERSHORTNAME() As String
    6. Get
    7. ' Gets the property value.
    8. Return _Name
    9. End Get
    10. Set(ByVal Value As String)
    11. ' Sets the property value.
    12. _Name = Value
    13. End Set
    14. End Property
    15. Public Property NUMBER001() As String
    16. Get
    17. ' Gets the property value.
    18. Return _NUMBER001
    19. End Get
    20. Set(ByVal Value As String)
    21. ' Sets the property value.
    22. _NUMBER001 = Value
    23. End Set
    24. End Property
    25. Public Property SEARCHSTRING() As String
    26. Get
    27. ' Gets the property value.
    28. Return _Suchtext
    29. End Get
    30. Set(ByVal Value As String)
    31. ' Sets the property value.
    32. _Suchtext = Value
    33. End Set
    34. End Property
    35. End Class


    Leider kenne ich mich mit Typisierung zu wenig aus, um selbst drauf zu kommen. Vielleicht kann mir jemand einen Hinweis geben, nach was ich noch suchen kann.

    (Windows 7 64bit, Visual Studio 2015 Pro, SQL Server 2005)
    kannste einfach vergessen.
    Du erstellst eine Liste anonymer Typen, tja, die sind anonym, von denen kannst du keine Property mehr abrufen - anonym - die Properties haben keine Namen.

    Also mach den die Anonymität weg, und erstelle eine Auflistung ordentlicher Objekte:

    VB.NET-Quellcode

    1. Dim APLieferanten = From Lief In DBBde.SPRAPLieferanten
    2. Order By Lief.NAME
    3. Where Lief.PATH001 = "AP"
    4. LBAPLieferanten.DataContext = APLieferanten
    geht genauso gut, nur besser.

    (du merkst vlt. - von anonymen Typen bin ich nicht soo der Fan ;) )
    Hallo Ihr beiden,
    erst Mal vielen Dank für die Antworten.
    Die Lösung von ErfinderdesRades klappt schon mal. :thumbsup:
    Ganz klar ist mir aber der Unterschied noch nicht. Wieso wird mit Select eine anonymer Typ erzeugt und ohne Select steht mir die ganze Struktur der Datenquelle zur Verfügung (auch wenn Intellisense davon nix weiß.)?
    Und was mache ich, wenn ich doch mal ein Select verwenden muss? Aber egal. So weit bin ich noch nicht. Vielen Dank erst Mal.
    jo, vb kann eine verkürzte Linq-Syntax: Wenn der Select-Abschnitt weggelassen wird, dann wird einfach die "Laufvariable" Selectiert. Also verbose formuliert ginge die Query so, und dann sieht man, dass richtige Objekte selectiert werden, und keine anonymen Unbrauchbarkeiten:

    VB.NET-Quellcode

    1. Dim APLieferanten = From Lief In DBBde.SPRAPLieferanten
    2. Where Lief.PATH001 = "AP" Order By Lief.NAME
    3. Select Lief
    Das ist dasselbe wie oben, und die lief-Dinger haben ja einen richtigen Datentyp.
    Übrigens hab ich den Where-Abschnitt vorgezogen, es ist performanter, wenn nur die gefilterte Teilmenge sortiert wern muss.


    Hingegen dein ursprüngliches

    VB.NET-Quellcode

    1. Select Lief.SPRUPARTNERSHORTNAME, Lief.NUMBER001, Lief.SEARCHSTRING
    erzeugt wie gesagt einen anonymen Datentyp mit 3 Properties.
    Bei anonymen Datentypen sind die Properties nur lokal in der Methode bekannt, wo sie genriert werden.
    Deshalb kann ein AD niemals an eine andere Methode übergeben werden, und das verhindert jede weitergehende Datenverarbeitung.
    Verhindert ist damit auch die Möglichkeit, das SelectedItem einer an sowas gebundenen Listbox in irgendeiner Weise auszuwerten.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hallo,
    nur nochmal der Vollständigkeit halber. Nachdem ich in meinem Projekt Option Strict mal ON geschaltet habe, hat der Compiler mir in der Auswertung ein nicht mögliches late Binding vorgeworfen.

    Nun bin ich wie von VincentTB vorgegangen und habe einen DirectCast mit dem entsprechenden Typ eingebastelt und schon geht es wieder..... Mann, mann, mann. Nix is mehr quick and dirty.....

    VB.NET-Quellcode

    1. ​LKW.Lieferant = DirectCast(LB05APLieferanten.SelectedItem, SPRAPLieferanten).NUMBER001