Laden...

ComboBox mit Usercontrol als Item?

Erstellt von el_vital vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.759 Views
E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 9 Jahren
ComboBox mit Usercontrol als Item?

Gibt es eine Möglichkeit bei einer ComboBox in WPF UserControls als Items zu verwenden?
Wie zum Bespiel in diesem Bild:

T
314 Beiträge seit 2013
vor 9 Jahren

Sicher, einfach das ItemTemplate entsprechend setzen.

E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 9 Jahren

Hallo t0ms3n,
ich bekomme das leider nicht richtig zum Laufen.

Ich habe folgendes als ItemTemplate zugewiesen:


 <ComboBox.ItemTemplate>
                <DataTemplate>
                    <local:UserControlComboBoxElementWS/>
                </DataTemplate>
            </ComboBox.ItemTemplate>

und folgendes als ItemsSource="{Binding UserControlList}"

In dem C# Code:


        ObservableCollection<UserControlComboBoxElementWS> _UserControlList = new ObservableCollection<UserControlComboBoxElementWS>();
        public ObservableCollection<UserControlComboBoxElementWS> UserControlList
        {
            get
            {
                return _UserControlList;
            }
            set
            {
                _UserControlList = value;
            }
        }

Dann erzeuge ich 10 Objekte des UserControlComboBoxElementWS, fülle die mit Daten und füge die der Liste UserControlList hinzu. Es werden auch 10 Elemente in der Combobox angezeigt. Jedoch ohne Daten. Wenn ich solch ein UserControlComboBoxElementWS direkt auf der Oberfläche platziere und dem Control Daten zuweise, dann werden diese angezeigt.

Jedes Mal wenn ich die Combobox öffne, werden aus irgendeinem Grund 10 neue Objekte mit dem Aufruf des leeren Konstruktors erzeugt und dadurch sind die Elemente ohne Daten. Ich weiß leider nicht was ich falsch mache.

5.299 Beiträge seit 2008
vor 9 Jahren

Tja, wenn du's nicht weißt, dann weiss es wohl niemand.
Weil niemand sonst kann ja deinen Code angucken.

Angebot: Mach du ein Testprojekt mit deinem Datenmodell und deiner Oberfläche soweit als möglich, zippe das - nur Sources, aber lauffähig!! - dann kann ich mal reingucken.

Der frühe Apfel fängt den Wurm.

T
314 Beiträge seit 2013
vor 9 Jahren

Hi,

dein Control erhält das entsprechende Item in der Liste als DataContext. Deine Liste sollte also nicht die UserControls dafür enthalten, sondern den nötigen DataContext bzw. das ViewModel.

Falls das Fragen aufwirfst, such hier im Forum z.B. mal nach MVVM.

Gruß
t0ms3n

E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 9 Jahren

Hi,

dein Control erhält das entsprechende Item in der Liste als DataContext. Deine Liste sollte also nicht die UserControls dafür enthalten, sondern den nötigen DataContext bzw. das ViewModel.

Falls das Fragen aufwirfst, such hier im Forum z.B. mal nach MVVM.

Gruß
t0ms3n

Ich möchte schon, dass mein UserControl das zu darstellende Objekt ist. Also, dass die Liste die UserConstrolls enthält. Das was für Daten und in welcher Form in der ComboBox zu sehen sind, soll das jeweilige UserControl entscheiden. Jedes Element könnte also in der ComboBox anders aussehen, abhängig von dem Zustand und den Daten des UserControls.

E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 9 Jahren

Das ist ein "Bug" der Combobox.
Es ist hier vom user128300 beschrieben: http://stackoverflow.com/questions/24008310/wpf-binding-in-combobox-with-usercontrol-list

T
314 Beiträge seit 2013
vor 9 Jahren

Wie Du vermutlich auch gesehen hast, steht in den Antworten jedoch das gleiche.

Das Binding schließt im übrigen nicht aus, dass die Controls unterschiedlich aussehen.

E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 9 Jahren

Wie Du vermutlich auch gesehen hast, steht in den Antworten jedoch das gleiche.

Das Binding schließt im übrigen nicht aus, dass die Controls unterschiedlich aussehen.

Ja, ist richtig. Ich habe es jetzt wie von dir vorgeschlagen umgesetzt und es funktioniert. Auch das Aussehen wird über Binding von zum Beispiel einem Brush als Background gesteuert.

Das Einzige, was nicht geklappt hat ist das Binding von Methoden anstelle von Properties. Das wollte ich machen weil ich die Objekte serialisiere und ein Brush nicht serialisierbar ist. Ich hätte die Farbe gerne als Hex-String oder als Color serialisiert und in einer Methode GetColor() ein Brush zurück geliefert. Die Methode GetColor() konnte ich aber nicht "binden".

T
314 Beiträge seit 2013
vor 9 Jahren

Sowas kannst Du z.B. über einen Converter lösen.