Liste an andere Liste binden

  • WPF

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

    Liste an andere Liste binden

    Ich habe in einem Projekt "MeineDevices" eine KlasseDeviceUsb und eine Klasse IO_Devices. In IO_Devices habe ich eine List<DeviceUsb>.
    Dann habe ich in einem anderem Projekt "MeineDevicesUserControls" ein UserControl UcDeviceUsb, und eine UserControl UcIO_Devices.
    In UcIO_Devices hätte ich gern eine List<UcDeviceUsb>, die Abhängig von/gebunden an die List<DeviceUsb> von IO_Devices ist.
    Diese List<UcDeviceUsb> würde ich dann wiederum gern an ein Stackpanel im UcIO_Devices binden.

    Ziel ist es, bei Änderungen der List<DeviceUsb> UserControls zum Stackpanel hinzuzufügen/zu entfernen, ohne das händisch machen zu müssen.
    Ist das technische überhaupt möglich? Weil das wäre ja quasi eine List<T>, die an eine List<U> gebunden werden soll ?(
    Ich habe mir eben mal Grundlagen - MVVM-Pattern, DataContext und DataTemplates im Treeview und 2.1.4.5 - Binding über DataTemplates angeschaut.
    Allerdings bin ich nicht sicher, ob mein Vorhaben damit tatsächlich umsetzbar ist.

    Das Stackpanel soll ja gebunden an die List<UcDeviceUsb> gebunden sein. Das würde ich hinbekommen.
    Was mir noch nicht klar ist:

    C#-Quellcode

    1. //namespace MeineDevices
    2. public List<DeviceUsb> UsbDevices {get;set;}
    3. public void AddUsbDevice(){
    4. UsbDevices.Add(new DeviceUsb());
    5. }


    Wie wird durch AddUsbDevice() getriggert, dass in

    C#-Quellcode

    1. //namespace MeineDevicesUserControls
    2. public List<UcDeviceUsb> UcUsbList{get;set;}
    UcUsbList ein neues UcDeviceUsb geadded wird?
    ich denke den Datentyp UcDeviceUsb brauchst du nicht, folglcih auch nicht List<UcDeviceUsb>.
    Du brauchst nur public List<DeviceUsb> UsbDevices {get;set;}.
    Dafür baust du dir ein DataTemplate, was deine UsbDevices korrekt anzeigt.
    Das DataTemplate kann auch ein usercontrol enthalten - das mach ich oft so, weil das Usercontrol kann man inne XamlVorschau direkt sehen, ein DataTemplate nicht.
    Daher baue ich ein UserControl - das mag kompliziert sein.
    Und ein DataTemplate mit nur diesem UserControl drinne - dassis simpel.
    gugge vlt. Grundlagen - MVVM-Anwendungs-Struktur - da gibts - besonders im Post "Variations" - verschiedene Varianten von DataTemplates, für dasselbe Viewmodel.
    Wie ErfinderDesRades richtig schreibt benötigst du DataTemplates. Aber was ich noch anmerken möchte. Verwende unbedingt in diesem Fall eine ObservableCollection statt einer ListOf da diese Änderungsbenachrichtigung iCollectionchanged implementiert und die WPF somit über Änderungen benachrichtigt wird und die View aktualisiert.

    Ansonsten, wenn du nicht weiterkommst und dich im binding verlierst lade doch gerne ein minimalistisches Beispiel hoch und wir bekommen das sicher hin.

    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. ##

    Erstmal danke für eure Ratschläge.
    Ich nehme die nächsten zwei Wochen an einem Lehrgang für WPF teil, das ganze Konzept ist doch sehr neu und noch komplex für mich.

    Wenn ich etwas weiter bin melde ich mich noch mal bezüglich des Threads.
    Sollte ja kein Problem sein den Thread solang auf offen zu lassen oder?
    Also nun doch WPF?

    Ich kenne mich nicht mehr aus. Mein Tutorial vermitelt im aktuellen Zustand würde ich meinen schon mal alle nötigen Grundlagen und ohne diese zu beherschen solltest du die finger von MVVM lassen, du wirst verzweifeln, und die wärst sicher nicht der erste. Die Grundlagen müssen sitzen, die WPF und ihr Bindingsystem musst du beherschen, genauso wie Vererbung, Interfaces usw.

    Aber wenn man das hat ist es dafür nur noch ein Katzensprung und macht dann viel spass.

    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. ##

    War doch die ganze Zeit die Rede von WPF dachte ich ?( Falls das nicht exlipizit klar war ist das meine Schuld.

    Dein Tutorial ist, wie du schon sagst, sehr umfangreich und ausführlich. Aber ich bin leider der Lerntyp, der am Anfang etwas mehr an die Hand genommen werden muss, bzw. komme ich besser voran, wenn sowas interaktiv ist. Deshalb hab ich mich ja über die Firma für einen Lehrgang eingetragen, um ad hoc Fragen mit einem Dozenten abzuklären und gezielter Unklarheiten zu beseitigen.
    OH, sorry. Mein fehler. Hatte die Threads verwechselt.

    Ich nehme alles zurück. =O

    wie gesagt, lade doch gerne mal ein Beispiel hoch und wir gehen das gemeinsam durch. Ich nehme dich dann an die Hand. ;)

    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. ##

    Der Lehrgang hat etwas Licht ins Dunkle gebracht :thumbup:

    Nicht alle Projekte in der Projektmappe sind von mir, aber die sind bei meinen Projekten aus gegebenem Grund notwendig.
    Wirklich relevant sind eigentlich nur die Projekte TestWindow und UcDeviceList.
    Im MainWindow von TestWindow sollen in einer ListBox ein oder mehrere UserControls aus UcDeviceList hinzugefügt/entfernt werden.

    EDIT: Anhang wieder entfernt, weil nicht kompilierbar

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Schmittmuthelm“ ()

    Hallo

    Leider kann dieses Projekt nicht kompiliert werden da einige abhängigkeiten fehlen. Für die Community somit leider nicht verwendbar.

    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. ##

    Hallo

    Ich bin nun dazu gekommen mir das schnell anzusehen.



    Die ListBox ist ja auf eine ObservableCollection(Of Device) gebunden.
    Und nun willst du das Property MyDevice des UserControl UcDevice an das aktuelle Item (denn für jedes Item in der Auflistung wird ja ein UcDevice gerendert) binden?

    Wenn ja dann so:

    XML-Quellcode

    1. <Uc:UcDevice MyDevice="{Binding}" />


    Aber.... und jetzt kommt das aber. Du wirst ne Fehlermeldung bekommen. Lese diese durch.
    Du kannst eben nur auf eine Dependency Property binden. Nicht an ein "normales". Das sollte in deinem Kurs/Workshop in der ersten Stunde durchgenommen worden sein.
    Falls ich also richtig mit meiner Annahme liege dann schau dir das Kapitel zu Dependency Properties meines Tutorial an. Ansonsten unterstütze ich dich gerne.

    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. ##

    Also ich habe

    C#-Quellcode

    1. private Device.Device _myDevice;
    2. public Device.Device MyDevice { get => _myDevice; set => SetProperty(ref _myDevice, value) ; }
    mit

    C#-Quellcode

    1. public static DependencyProperty MyDeviceProperty = DependencyProperty.Register(nameof(MyDevice), typeof(Device.Device), typeof(UcDevice));
    2. public Device.Device MyDevice { get => (Device.Device)this.GetValue(MyDeviceProperty); set => this.SetValue(MyDeviceProperty, value); }
    ersetzt und im xaml <Uc:UcDevice MyDevice="{Binding}" />

    Hier erhalte ich dann die Fehlermeldungen
    Spoiler anzeigen
    System.Windows.Data Error: 1 : Cannot create default converter to perform 'one-way' conversions between types 'UcDevice.UcDevice' and 'Device.Device'. Consider using Converter property of Binding. BindingExpression:Path=; DataItem='UcDevice' (Name=''); target element is 'UcDevice' (Name=''); target property is 'MyDevice' (type 'Device')
    System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value='UcDevice.UcDevice' BindingExpression:Path=; DataItem='UcDevice' (Name=''); target element is 'UcDevice' (Name=''); target property is 'MyDevice' (type 'Device')


    Wenn ich im code-behind vom UcDevice den DataContext von this auf MyDevice ändere und im xaml die Bindungen entsprechend anpasse, habe ich keine Fehlermeldungen.
    Es wird allerdings immer der parameterlose Konstruktor aufgerufen. Wichtig für mich wäre aber der parametrierte Konstruktor, da ich nur diesen in meiner tatsächlichen Anwendung aufrufe, nie den parameterlosen.
    An der Stelle hängt es noch in meinem Kopf ?(
    Dateien
    • Test_DP.zip

      (133,67 kB, 69 mal heruntergeladen, zuletzt: )

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

    Hallo

    Aber das Property muss ja vom Typ Device sein, nicht vom Typ UcDevice.
    Du willst ja nicht auf ein control binden sondern auf die Daten und die sind vom typ Device.

    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. ##

    OK weil Cannot create default converter to perform 'one-way' conversions between types 'UcDevice.UcDevice' and 'Device.Device' sagt das hier was anderes reingereicht wird.
    aber ich schau mir das gerne am Abend genauer an, hab hier in der Arbeit nicht die möglichkeit im Moment.

    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. ##