Mehrere Listboxen an gleiche Daten binden.

  • WPF

Es gibt 43 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Hallo

    Jeiss schrieb:

    Geht das mit einem gewöhnlichen Visual Studio 2015, oder so? Oder brauch man da "Hilfsmittel"? Hab da an Blend gedacht, weil du ja in deiner letzten Antwort "Blend.Interactivity" erwähnst. Kenn das leider noch nicht

    Ich habs zwar in VS 2017 erstellt, sollte aber auch in VS 2015 ohne probleme zu öffnen sein. Die dll`s welche ich eingebunden habe wurden von Microsoft für das Blend entwickelt und wenn du in Blend gewisse Trigger einfügst werden diese in das Projekt automatisch eingefügt. Du musst deshalb aber kein Blend installiert haben. Auch auf den Zielsystem muss naturlich nichts installiert werden. Dafür dorgt das NuGet Paket. Dieses zieht die zwei dll`s in dein Projekt und macht sie verfügbar.

    Aller läuft wie gewohnt, das Pakte erspart nur einiges an Arbeit.

    ErfinderDesRades schrieb:

    Thema Mocking

    Sorry, aber die benennung ist imho meiner Meinung nach nicht korrekt. Korrekt wäre DesignTimeData oder DesignData oder ähnliches. Mock oder Mocking findet nur bei Unit oder Integrationtests verwendung, Ein Mock ist imho ein Siimulierung, Daten zur Entwicklungszeit sind keine Simulierung.

    Sorry, musste sein, aber kann jeder machen wie er will, solange er es dann auch nach längerer Zeit unterscheiden kann.

    Grüße LEute
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Sorry, aber die benennung ist imho meiner Meinung nach nicht korrekt. Korrekt wäre DesignTimeData oder DesignData oder ähnliches. Mock oder Mocking findet nur bei Unit oder Integrationtests verwendung, Ein Mock ist imho ein Siimulierung, Daten zur Entwicklungszeit sind keine Simulierung.
    Hmm Gugge Wiki: de.wikipedia.org/wiki/Mock-up , de.wikipedia.org/wiki/Mock-Objekt
    Mock heisst "Attrappe", und DesignTime-Daten fasse ich als Attrappe auf - bzw im 2. Wiki-Artikel werden Mock-Objekte als "Platzhalter für Objekte, die für das Testen eines anderen Teils benötigt werden" bezeichnet, und ich find das trifft zu: Ich will sehen, ob die Oberfläche funzt, aber ohne aussm Designer heraus teure Laufzeit-Datenzugriffe auszuführen. Daher brauche ich Daten-Attrappen. (Die lassen sich übrigens bestimmt auch für UnitTests verwenden - evtl. müsste man dafür bisserl das Design zuschneiden - weiss ich nicht - ich bin kein Unit-Tester, aber lass uns das hier nicht diskutieren)
    Auf jeden Fall ist ein Mock keine Simulierung, sondern ist eine Komponente (was immer damit gemeint ist), die zur Simulierung dient.

    Edit: Aber haste recht - ich hab weiter oben Mocking nur am Beispiel DesignTimeData erklärt, und allein so erklärt muss man den Begriff viel enger auffassen als wie ich ihn eiglich meine (und ich glaube er auch gemeint ist).
    Schon

    ErfinderDesRades schrieb:

    Mocking ist ein Prinzip inne Wpf.
    ist ziemlich falsch - es ist ein Prinzip inne Software-Entwicklung, ja sogar auch in anderen Produktions-Zweigen.
    Nur während es in anderen Bereichen tw. nur gelegentlich angewendet wird, ists vom Wpf-Designer ja direkt vorgesehen, Mock-Daten anzuzeigen, und gibt ja sogar extra dafür den d:-Namespace (obwohl ich den fast nie brauche).

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

    Hallo

    Wollte dich nicht angreifen. KAnn ja jeder bennen wie er will. Nur kurz wegen deinem Link.

    Zitat aus deinem Wiki Link gleich in der ersten Zeile:
    ist in der Softwareentwicklung ein Programmteil, der zur Durchführung von Modultests als Platzhalter für echte Objekte verwendet wird.

    Kann man jetzt sehen wie man will. Wenn man MVVM proggt ist man ja in der Lage UnitTests zu erstellen, und hier muss man gewise Module auch Mocken. Hat aber mit den DesignTimeDaten nicht viel zu tun. Aber wie gesagt, kann jeder handhaben wie er will. Bitte verwende weiterhin Mock. Wollte nur in der Raum werfen das man für UnitTests auch Mocks sagt und hier dann verwirrt sein könnte. Wenn man keine UnitTests macht ist das vermutlich egal.

    Fühl dich also bitte nicht angegriffen.

    Schöne Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    ne, fühlich garnet.
    einen Moment war ich geneigt, dir recht zu geben, das hätte mich in Bedroullie gebracht, weil dann hätte ich mir ein neues Wort ausdenken müssen für was ich damit meine.
    Weisst ja: Ich finde, mit Begriffen muss man korrekt umgehen, sonst weiß man sehr bald selbst nicht mehr, was man redet (s.o.: da stammen dann auf einmal "Daten aus der Listbox" und sowas..).
    Hallo,
    ​Also mit den Fachausdrücken, das geb ich zu, die beherrsche ich nicht so super gut.
    ​Will mich auch nicht in eure Diskussionen einmischen. Ich begnüge mich damit den Code zu verstehen.
    ​Und da wären wir ja auch schon beim Thema.
    ​@ErfinderDesRades
    ​Dein Programm ist für mich nur sehr schwer zu verstehen. Aber da ich ja was dazulernen möchte, versuche ich so gut wie's geht das wesentliche zu verstehen....
    ​Meine Erste Frage ist gewiss nicht die wichtigste, aber ich möchte halt den Grund dafür verstehen.
    ​In deiner UrgentOrder Klasse, beim "belegen" der MockData. Da werden der ObservableCollection 7 neue UrgentOrder hinzugefügt.
    Warum werden 5 der UrgentOrder-Eigenschaften dem Konstruktor (Sub New) als parameter übergeben, und jeweils 2 mit

    VB.NET-Quellcode

    1. With {.
    "angehängt" ?

    Danke,
    Jeiss
    man kann auch alle im Konstruktor übergeben, aber das kam mir unleserlich vor. With { . ist zwar hässlich länglich, hat aber den Vorteil, dass dann da auch steht, was man zuweist.
    Sonst hätteste dem Konstruktor 7 Argumente übergeben, und 3 davon wären Nummern gewesen - recht riskant, da durcheinanderzukommen.
    Aber die 5 kann man schon auseinanderhalten, so leidlich.
    ok, das war ja recht einfach. Das versteh sogar ich....
    Bin gerade dabei den XAML Code von Window1 zu studieren.
    Bitte jetzt nicht übelnehmen wenn ich mich so "einfach" ausdrücke ;)

    Du hast ja selber so was in der Art gesagt wie, wir hätten es mit Listen von Listen zu tun..
    Könnte man ganz krass vereinfacht dargestellt sagen, dass die "äußere" listbox, als "Elemente/Items" jeweils eine Textbox und eine Listbox darstellt?
    ​Nur dass die "äussere" ListBox eben die Items, statt untereinander (vertikal) eben nebeneinander (besser gesagt nacheinander im WrapPanel) darstellt?
    ​Verstehst du wie ich das meine...?

    Danke,
    ​Jeiss
    jo, genau.
    Die "inneren" Listen sind übrigens keine reinen Listen, sondern das sind Objekte mit einem WorkCenter-Wert und einer Liste (Zeilen #14, #15).

    VB.NET-Quellcode

    1. Public Class WorkCenterTour
    2. Public Shared ReadOnly MockData As New ObservableCollection(Of WorkCenterTour)
    3. Shared Sub New()
    4. For Each enm As WorkCenter In [Enum].GetValues(GetType(WorkCenter))
    5. MockData.Add(New WorkCenterTour(enm))
    6. Next
    7. End Sub
    8. Public Sub New(wc As WorkCenter)
    9. Me.WC = wc
    10. TourView = New ListCollectionView(UrgentOrder.MockData) With {.Filter = Function(obj As Object) CType(obj, UrgentOrder).Wkc = wc}
    11. End Sub
    12. Public Property WC As WorkCenter
    13. Public Property TourView As ListCollectionView
    14. End Class
    Und im Xaml werden die eben genau als

    Jeiss schrieb:

    jeweils eine Textbox und eine Listbox
    dargestellt.
    (Nein, nicht Textbox, sondern Textblock)
    Ja richtig, TextBlock und nicht TextBox. Sorry
    ​Der Textblock welcher an den WorkCenter-Wert WC gebunden ist.

    ​Ok, der XAML von Window1 das geht ja einigermassen.
    ​Hätte den zwar niemals selber programmieren können, aber wenigstens verstehe ich einigermaßen was er bewirkt/darstellt.

    ​Was die WorkCenterTour Klasse, die du nochmal gerade gezeigt hast, angeht... Damit hab ich noch so meine Schwierigkeiten.
    ​Muss mir das morgen in Ruhe angucken.
    Was ich bis jetzt verstanden hab, ist, dass wir da den WorkCenter -Name, also seine Bezeichnung zum filtern verwenden.
    ​Finde ich irgendwie besonders schlau. Sehr elegant. So nach dem Moto. Das Vorhandene/schon Bestehende benutzen statt was neues hinzuzufügen....

    Danke,
    ​Jeiss
    du musst dich jetzt nicht ständig für deine Formulierungen entschuldigen.
    Formulierungen sind mir ziemlich egal, auch Grammatik ist mir schnurz.
    Nur weil ich einmal hofflich intensiv genug einem (leider extrem gängigen) verheerenden Denkfehler Einhalt zu gebieten versucht hab.

    Also solange etwas Sinn ergibt ist alles gut. Nur bei sinnlosen Aussagen, wo die Leuts ihre Datagridse "füttern" und sowas - da werd ich kribblig.
    Oder eben wenns doch Sinn ergibt, aber den verkehrten (Daten kommen aus Listboxen - das ist leider tatsächlich möglich - zumindest in WinForms, aber wer dem nachgeht, ist am Ende für Jahre auf finstersten Holzwegen unterwegs.)



    Aber Klugscheissen hat noch niemandem geschadet:
    Wir nehmen nicht den WorkCenter-Name zum Filtern, sondern den WorkCenter-Wert. Genauer: wir nehmen ein Objekt des Datentyps WorkCenter zum Filtern. Weil WorkCenter ist ein Enum, und ist somit ein Datentyp. Und WorkCenterTour auch. Und WorkCenterTour hat eine Property des Datentyps WorkCenter - daher kann man einer WorkCenterTour einen WorkCenter-Wert zuweisen.
    Jo - und den nimmter dann zum Filtern - klar.



    Achso - Begriffe sind wichtig: Was ist ein Datentyp, was ist ein Enum, was eine Auflistung, was ist ein Name, was ein Feld, Property, und und und.
    Gugge diese Dinge hier: Grundlagen: Fachbegriffe und lies ausserdem ein gut Buch.
    Hallo,
    ja ich denke so langsam dran dieses Theme abzuschließen. Meine Frage wurde auf jeden Fall gründlich beantwortet und obendrein hab ich viel dazu gelernt.

    Aber eine Frage beschäftigt mich trotzdem noch. Meine Listen werden ja jetzt gefiltert angezeigt, aber kann ich die jetzt zusätzlich auch sortiert anzeigen lassen.
    Z.B. nach einer der Integer Eigenschaften, und zwar der Eigenschaft "OrderNbr". Geht das noch?
    ​Wenn das geht
    dann wird es sich ja wohl in dem Code-Abschnitt abspielen...

    Quellcode

    1. ​ Public Sub New(wc As WorkCenter)
    2. Me.WC = wc
    3. TourView = New ListCollectionView(UrgentOrder.MockData) With {.Filter = Function(obj As Object) CType(obj, UrgentOrder).Wkc = wc}
    4. End Sub

    ​Hinter

    Quellcode

    1. .Wkc = wc​
    ein Komma setzen und mit ".Sort =" weitermachen scheint ja nicht zu gehen...
    Kann da jemand weiterhelfen?

    ​Danke,
    Jeiss

    Jeiss schrieb:

    dieses Theme abzuschließen
    hohoho! - selten so gelacht!
    im Ernst: Dassis ein ziemlich gutes Thema, und da kannste bestimmt noch jede Menge dran lernen.

    ZB kannste genau jetzt den Umgang mittm ObjectBrowser lernen: VisualStudio richtig nutzen (Google ist nicht deine Mami)
    Aber beachte genau den Video-Film, und auch alle Posts dazu, insbesondere, wie man den OB am günstigsten einstellt.
    Wennde dir im OB die Properties von ListCollectionView anguckst, müssteste eiglich die Antwort finden.
    Zumindest die zuständige Property.
    Und wennde die Property hast, kannste vlt. erkennen, wie man die einsetzt. Zumindest kannste dann googeln für Code-Beispiele. Und sonst kannste immer noch hier fragen.

    Ich hab jetzt nochmal geguckt - das ist 'ne wirklich gute Übung, zu lernen, wie man sich ins Framework und in die VisualStudio-Logik einarbeitet - auch son bischen Detectiv-Arbeit.
    Hallo,
    Hab mal wieder einen Blick in den Objektbrowser geworfen. Ist für mich aber immer noch ziemlich verwirrend...

    Im Unterschied zu deinem Video zum OB, gelange ich irgendwie nicht vom "Code-Editor" in den Objektbrowser!
    Müsste ich nicht in den OB gelangen wenn ich, "ein Objekt" im Code-Editor anklicke, und dann im Kontextmenu auf "Go to definition F12" klicke? Liegt das an einer Einstellung?
    Will auch mal sehen ob ich auch so ein "local" Fenster einblenden kann, scheint mir auch ziemlich nützlich zu sein.

    Zurück zu meiner eigentlichen Frage, die bevor du auf den OB ausgewichen bist... ;)
    Thema sortieren, ListCollectionView sortieren.
    da hab ich dann auch eine Eigenschaft gefunden die mit sortieren was zu tun hat. Ein bisschen kompliziert finde ich, funktioniert aber. Das "Ding" heist Sortdescription...
    Read-only oder nicht?! Bin ich mir noch immer nicht sicher. Kann aber über Umwege gesetzt werden.
    Und hier das Ergebnis.

    Quellcode

    1. Public Sub New(wc As WorkCenter)
    2. Me.WC = wc
    3. TourView = New ListCollectionView(UrgentOrder.MockData) With {.Filter = Function(obj As Object) CType(obj, UrgentOrder).Wkc = wc}
    4. [color=#FF8C00]TourView.SortDescriptions.Add(New SortDescription("OrderNbr", ListSortDirection.Ascending)[/color])
    5. End Sub

    Musste aber eine zweite Zeile hinzufügen. Bekam das nicht auf die Reihe die SortDescription mit in das "With" zu integrieren.

    @ErfinderDesRades
    Ist das die Eigenschaft die ich "finden sollte", oder gibt es noch einen anderen, besseren Weg um meine Listen zu sortieren?

    Danke,
    ​Jeiss

    Jeiss schrieb:

    Müsste ich nicht in den OB gelangen wenn ich, "ein Objekt" im Code-Editor anklicke, und dann im Kontextmenu auf "Go to definition F12" klicke?
    ja, und sollte auch funktionieren. Guck nochma Video. Wenn man natürlich auf Schlüsselworte klickst, gibts da keine Definition von. Und wennde das ganze Wort selektierst, weissich auch nicht, obs geht.
    jdfs. das is ganz wichtig, dass das geht.



    Und das mitte SortDescription haste richtig rausgefunden. :thumbsup:
    Ja, ist bisserl umständlich. Man könnte sich aber auch eine Extension schreiben, wo man dann am Ende nur noch notiert:

    VB.NET-Quellcode

    1. TourView.AddSort("OrderNbr", ListSortDirection.Ascending)
    Wenn man sowas öfter braucht.

    Ah - mir ist wieder eingefallen, warum das so umständlich ist: Normal ist der CollectionView-Kram als im Xaml zu formulieren vorgesehen, und da wäre das Code-Design recht praktisch (für Xaml-Verhältnisse normal praktisch).
    Mein Umgang mit CollectionView ist da ja abweichend, dass ich die ins Viewmodel hole, um da codeseitig viele Möglichkeiten zu erhalten (etwa die Verwaltung des CurrentItem).

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

    ErfinderDesRades schrieb:

    Mein Umgang mit CollectionView ist da ja abweichend, dass ich die ins Viewmodel hole,

    Ne, mach ich auch so da viel flexibler. Man kann es auch im XAML formulieren, ist aber eher nur für die "statische" Anwendung gedacht oder wenn man mit CodeBehind arbeitet. Haste die CillectionView im ViewModel kann man damit eh schön Arbeiten. (Filtern, Sortieren, Gruppieren)

    Es ist richtig das das SortDesciption Property der ICollectionView ReadOnly ist. Mann sollte ihr auch nur SortDescriptions hinzufügen oder wieder Removen.

    Beispiel:

    VB.NET-Quellcode

    1. TourView.SortDescriptions.Add(New SortDescription("UrgentOrder", ListSortDirection.Ascending)
    2. TourView.SortDescriptions.Add(New SortDescription("SecondProperty", ListSortDirection.Ascending)

    Was ICH gerne mache um hier auch IntelliSense und Compilerprüfung zu haben ist das ich das Property gerne mit NameOf(prop) angebe.

    Man könnte auch einen IComparer implementieren:

    VB.NET-Quellcode

    1. Public Class TourSorter
    2. Inherits IComparer
    3. Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer
    4. Dim tourX As Tour = TryCast(x, Tour)
    5. Dim tourY As Tour = TryCast(y, Tour)
    6. Return TourX.Name.CompareTo(TourY.UrgentOrder)
    7. End Function
    8. End Class

    Und dann Anwenden mit:

    VB.NET-Quellcode

    1. TourView.CustomSort = New TourSorter()


    Das selbe gilt übrigens auch z.b. für das Gruppieren:

    VB.NET-Quellcode

    1. TourView.GroupDescriptions.Add(New PropertyGroupDescription("UrgentOrder"))


    Ich hoffe ich konnte damit Helfen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    Meine Antworten verschwinden hier irgendwie..... zu viele Buttons :D
    Dann versuch ich es mal mit Bildchen.


    ​So hier lande ich also wenn ich im Code -Editor z.B. in ListCollectionView​ klicke und dann im Kontext-Menu "Go to Definition" wähle. Da finde ich natürlich eine Menge hilfreiche Infos, ich kann auch zum nächsten "Begriff" browsen. Aber irgendwie ist das nicht der "klassische" OBjektBrowser....

    ErfinderDesRades schrieb:

    Das wäre nervig, dann müssteste den OB immer öffnen, und mit Such-Eingaben arbeiten.

    Ja, VS kann nun auch zum Code im .Net navigieren was ich gut finde.
    Kann abgeschaltet werden, für jeder Sprache extra.
    Hier ein Bild von den Optionen.



    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##