Laden...

ComboBox und ein Problem

Erstellt von Nexmo vor 2 Jahren Letzter Beitrag vor 2 Jahren 388 Views
N
Nexmo Themenstarter:in
36 Beiträge seit 2021
vor 2 Jahren
ComboBox und ein Problem

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();
                }
            }
        }



    }

P
57 Beiträge seit 2017
vor 2 Jahren

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

N
Nexmo Themenstarter:in
36 Beiträge seit 2021
vor 2 Jahren

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.

P
57 Beiträge seit 2017
vor 2 Jahren
  
 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?

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

N
Nexmo Themenstarter:in
36 Beiträge seit 2021
vor 2 Jahren

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?

N
Nexmo Themenstarter:in
36 Beiträge seit 2021
vor 2 Jahren

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>

C
55 Beiträge seit 2020
vor 2 Jahren

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:

  
<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

N
Nexmo Themenstarter:in
36 Beiträge seit 2021
vor 2 Jahren

Hallo,

Ich habe über Google übrigens
>
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:

  
<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?