Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
ComboBox und ein Problem
Nexmo
myCSharp.de - Member



Dabei seit:
Beiträge: 36
Herkunft: Eggenstein-Leopoldshafen

Themenstarter:

ComboBox und ein Problem

beantworten | zitieren | melden

Guten Morgen Zusammen.

Folgendes Problem habe ich aktuell.

ich habe eine Observable Collection<Adresse> welche ich an eine Listbox binde.
Durch anklicken eines eintrages (SelecetedItem) wird dieser Inhalt an ein Property Übergeben ( AddData von Adressdaten).
Dieser Inhalt von AddData wird dann an verschiedene Textboxen gebunden. Soweit klappt auch alles.

jetzt soll aber für Addresstyp anstelle einer Textbox eine vorgefüllte Combobox verwendet werden.
an diese ist der Inhalt von AddTyp gebunden.
(Addtyp.Adresstyp sowie AddTyp.ID_Adresstyp).

Wie bekomme ich das hin, dass er mir beim auswählen aus der Liste automatisch den Richtigen wert in der Combobox zuweist?
Bin da etwas verzweifelt.

<DockPanel Grid.Row="5" Grid.Column="1" Margin="5,5,5,5"  Visibility="{Binding Anzeigeändern, Converter={StaticResource bool2vis}, Mode=OneWay}">
                                        <ComboBox ItemsSource="{Binding Adresstypenliste}" SelectedItem="{Binding AddTyp.Adresstyp}" SelectedValue="{Binding AddData.AdressTyp}" HorizontalAlignment="Left" Height="25" Width="250" >
                                            <ComboBox.ItemTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding Adresstyp}" VerticalAlignment="Center" HorizontalAlignment="Left" />
                                                </DataTemplate>
                                            </ComboBox.ItemTemplate>
                                        </ComboBox>
                                    </DockPanel>

<ListBox ItemsSource="{Binding Adressdatenliste}" SelectedItem="{Binding AddData}">
                                        <ListBox.ItemTemplate>
                                            <DataTemplate>
                                                <StackPanel Orientation="Horizontal">
                                                    <TextBlock Text="{Binding Straße}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding Hausnummer}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding Plz}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding Ort}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding Land}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding AdressTyp}" Margin="5,0,5,0"/>
                                                </StackPanel>
                                            </DataTemplate>
                                        </ListBox.ItemTemplate>
                                    </ListBox>


 private Adressdaten addData = new Adressdaten();
        public Adressdaten AddData
        {
            get => addData;
            set
            {
                if (value != addData)
                {
                    addData = value;

                    AddTyp.Adresstyp = Adressdatenliste.FirstOrDefault(x => x.AdressTyp == AddTyp.Adresstyp).ToString(); // Funktioniert nicht
                    RaisePropertyChanged();
                    ChangeAdressData = true;

                    

                }
            }
        }

 private Adresstypen addtyp = new Adresstypen();
        public Adresstypen AddTyp
        {
            get => addtyp;
            set
            {
                if (value != addtyp)
                {
                    addtyp = value;
                    RaisePropertyChanged();
                }
            }
        }


class Adresstypen : NotifyableBaseObject
    {
        private string adresstyp, id_Adresstyp;
        public string Adresstyp
        {
            get => adresstyp;
            set
            {
                if(value!= adresstyp)
                {
                    adresstyp = value;
                    RaisePropertyChanged();
                }
            }
        }

        public string ID_Adresstyp
        {
            get => id_Adresstyp;
            set
            {
                if(value != id_Adresstyp)
                {
                    id_Adresstyp = value;
                    RaisePropertyChanged();
                }
            }
        }



    }
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Nexmo am .
private Nachricht | Beiträge des Benutzers
Platoon
myCSharp.de - Member



Dabei seit:
Beiträge: 54
Herkunft: NRW

beantworten | zitieren | melden

Ich würde dein "Funktioniert nicht" in ein separates Command setzen und beim entsprechenden Event im XAML (nicht Code-Behind sondern über die Behaviors) setzen.
So könnte man es machen.

Ich könnte mir auch vorstellen, dass es einfacher über ReactiveUI geht - aber da fuchse ich mich gerade selbst noch ein. Warum änderst du denn die Collections direkt in den Properties? Ist meines Erachtens nach keine gute Idee und sollte getrennt geschehen.
.....an unhandled exception is the first way to think about your pattern of programming....
.....nur weil ich nicht weiß was dort passiert, bedeutet es nicht, dass ich nicht weiß, wie man es lösen kann - aber das ist wahrscheinlich....
private Nachricht | Beiträge des Benutzers
Nexmo
myCSharp.de - Member



Dabei seit:
Beiträge: 36
Herkunft: Eggenstein-Leopoldshafen

Themenstarter:

beantworten | zitieren | melden

Zitat von Platoon
Ich würde dein "Funktioniert nicht" in ein separates Command setzen und beim entsprechenden Event im XAML (nicht Code-Behind sondern über die Behaviors) setzen.
So könnte man es machen.

Ich könnte mir auch vorstellen, dass es einfacher über ReactiveUI geht - aber da fuchse ich mich gerade selbst noch ein. Warum änderst du denn die Collections direkt in den Properties? Ist meines Erachtens nach keine gute Idee und sollte getrennt geschehen.


Wo ändere ich denn die Collection in den Properties?

Meine Collection ist hier ja noch gar nicht dabei.

zudem geht bei mir absolut gar nichts über den Code-Behind.

alles via Databinding über eine MainWindowViewModel klasse.
private Nachricht | Beiträge des Benutzers
Platoon
myCSharp.de - Member



Dabei seit:
Beiträge: 54
Herkunft: NRW

beantworten | zitieren | melden

Zitat von Nexmo



 private Adressdaten addData = new Adressdaten();
        public Adressdaten AddData
        {
            get => addData;
            set
            {
                if (value != addData)
                {
                    addData = value;

                    AddTyp.Adresstyp = Adressdatenliste.FirstOrDefault(x => x.AdressTyp == AddTyp.Adresstyp).ToString(); // Funktioniert nicht
                    RaisePropertyChanged();
                    ChangeAdressData = true;

                    

                }
            }
        }


Gute - CodeBehind ist etwas blöde ausgedrückt - aber genau an dem Punkt "Funktioniert nicht".

Warum lagerst du das nicht in ein Command aus?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Platoon am .
.....an unhandled exception is the first way to think about your pattern of programming....
.....nur weil ich nicht weiß was dort passiert, bedeutet es nicht, dass ich nicht weiß, wie man es lösen kann - aber das ist wahrscheinlich....
private Nachricht | Beiträge des Benutzers
Nexmo
myCSharp.de - Member



Dabei seit:
Beiträge: 36
Herkunft: Eggenstein-Leopoldshafen

Themenstarter:

beantworten | zitieren | melden

Zitat von Platoon


Warum lagerst du das nicht in ein Command aus?

Hab da tatsächlich keine Ahnung, wie ich das entsprechend umsetzen soll.

hättest du mir da einen Ansatz?
private Nachricht | Beiträge des Benutzers
Nexmo
myCSharp.de - Member



Dabei seit:
Beiträge: 36
Herkunft: Eggenstein-Leopoldshafen

Themenstarter:

beantworten | zitieren | melden

Habe i-wie einen kleinen teilErfolg gehabt:



<ComboBox ItemsSource="{Binding Adresstypenliste}" SelectedItem="{Binding AddData.AdressTyp}" SelectedValue="{Binding AddTyp.Adresstyp}"  SelectedValuePath="{Binding AddData.AdressTyp}" HorizontalAlignment="Left" Height="25" Width="250" >
                                            <ComboBox.ItemTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding Adresstyp}" VerticalAlignment="Center" HorizontalAlignment="Left" />


wenn ich en SelectedValuePath nur auf AddData binde, dann schreibt er mir immer als Typ "Private" rein, und nicht der, der tatsächlich mitgegeben wird.

in der Collection Adresstypenliste habe ich die ID_Adress_Typ und den AdressTyp.
bei Auswahl aus der Liste Adressdatenliste werden diese Daten an AddData übergeben.

diese übergabe an AddData wird dann direkt an Textboxen gebunden um dort eine weitere Bearbeitung zuzulassen.

Jetzt muss aber der Teil aus dem Textblock AdressTyp an die Combobox(siehe oben) weitergegeben werden, und dort aus der vorliegenden collection das richtige Objekt selektiert werden.
wenn dann über die Collection der Wert geändert wird( z.b. von Privat auf geschäftlich) dann soll das auch direkt in der Listbox wieder angezeigt werden, sodass die änderungen nur noch gespeichert werden müssen.

wie setze ich das um?? steh ich grad nur auf der Leitung, oder denke ich falsch??

bitte um aussagekräftige Hilfen, ggf. solcher, dass mir das einer mal an einem Beispiel vorzeigt.


<ListBox ItemsSource="{Binding Adressdatenliste}" SelectedItem="{Binding AddData}">
                                        <ListBox.ItemTemplate>
                                            <DataTemplate>
                                                <StackPanel Orientation="Horizontal">
                                                    <TextBlock Text="{Binding Straße}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding Hausnummer}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding Plz}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding Ort}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding Land}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding AdressTyp}" Margin="5,0,5,0"/>
                                                </StackPanel>
                                            </DataTemplate>
                                        </ListBox.ItemTemplate>
                                    </ListBox>
private Nachricht | Beiträge des Benutzers
ClaraSoft
myCSharp.de - Member



Dabei seit:
Beiträge: 42

beantworten | zitieren | melden

Hallo,

Ich habe über Google übrigens difference-between-selecteditem-selectedvalue-and-selectedvaluepath gefunden. Dort wird der Unterschied zwischen SelectedItem, SelectedValue und SelectedValuePath erklärt. Grob gesagt gibt SelectedItem das ausgewählte Object aus deiner Collection zurück, die an deine Comboxbox gebunden ist. Während SelectedValue und SelectedValuePath angeben auf welchen Wert z.B. die ID, des ausgewählten Objects, gebunden werden soll. Kurz gesagt du sollest deine Bindings hier nochmal überdenken:
Zitat von Nexmo

<ComboBox ItemsSource="{Binding Adresstypenliste}" SelectedItem="{Binding AddData.AdressTyp}" SelectedValue="{Binding AddTyp.Adresstyp}"  SelectedValuePath="{Binding AddData.AdressTyp}" HorizontalAlignment="Left" Height="25" Width="250" >
                                            <ComboBox.ItemTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding Adresstyp}" VerticalAlignment="Center" HorizontalAlignment="Left" />

Grüße
private Nachricht | Beiträge des Benutzers
Nexmo
myCSharp.de - Member



Dabei seit:
Beiträge: 36
Herkunft: Eggenstein-Leopoldshafen

Themenstarter:

beantworten | zitieren | melden

Zitat von ClaraSoft
Hallo,

Ich habe über Google übrigens difference-between-selecteditem-selectedvalue-and-selectedvaluepath gefunden. Dort wird der Unterschied zwischen SelectedItem, SelectedValue und SelectedValuePath erklärt. Grob gesagt gibt SelectedItem das ausgewählte Object aus deiner Collection zurück, die an deine Comboxbox gebunden ist. Während SelectedValue und SelectedValuePath angeben auf welchen Wert z.B. die ID, des ausgewählten Objects, gebunden werden soll. Kurz gesagt du sollest deine Bindings hier nochmal überdenken:
Zitat von Nexmo

<ComboBox ItemsSource="{Binding Adresstypenliste}" SelectedItem="{Binding AddData.AdressTyp}" SelectedValue="{Binding AddTyp.Adresstyp}"  SelectedValuePath="{Binding AddData.AdressTyp}" HorizontalAlignment="Left" Height="25" Width="250" >
                                            <ComboBox.ItemTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding Adresstyp}" VerticalAlignment="Center" HorizontalAlignment="Left" />

Grüße


Ich hab ja oben beschrieben, was ich machen möchte, bzw. muss.

da ich allerdings ja i-wie da grad nicht weiterkomme hab ich ja extra um ein entsprechendes Beispiel gebeten.


Ich hoffe es ist überhaupt klar, was ich machen möchte, oder?
private Nachricht | Beiträge des Benutzers