none
Combo Box Eintrag wird nicht angezeigt RRS feed

  • Frage

  • Guten Morgen zusammen,

    ich hoffe Ihr könnt mir helfen. Ich suche und tüftel schon seit Tagen, komme aber nicht drauf.

    Ich habe in einem Detail Fenster verschieden Felder, die ich in XAML binde. Die Datenbefüllung erfolgt über eine Linq Abfrage im Hauptfenster:

         _fKünd.DataContext = _Künd.KündigungsdatenSatzLaden(_AktID)
    
     _fKünd.Show()
    

    Funktioniert auch alles.

      

    <TextBoxx:Name="tbBemerkung"Text="{BindingPath=Bemerkung}"HorizontalAlignment="Left"Height="66"Margin="159,412,0,0"TextWrapping="Wrap"VerticalAlignment="Top"Width="608"SpellCheck.IsEnabled="True"/>

    <ComboBoxx:Name="cbKündigungsgrund"ItemsSource="{Binding}"IsSynchronizedWithCurrentItem="True"HorizontalAlignment="Left"Margin="159,363,0,0"VerticalAlignment="Top"Width="208"IsReadOnly="True"/>

    Die Combobox wird ebenfalls per Linq geladen  -funktioniert auch bei einem Neueintrag

        Private Sub KündigungsgründeLaden()
    
            Try
                With cbKündigungsgrund
                    .DataContext = _cls.KündigungsgrundLaden
                    .DisplayMemberPath = "KG_Bezeichnung"
                    .SelectedValuePath = "KG_ID"
                    .SelectedIndex = 0
                End With
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    
        End Sub

        Mein Problem ist jetzt. Wenn ich einen vorhandenen Datensatz reinlade, bekomme ich den Grund NICHT angezeigt.

    Ich hoffe ich habe es einigermaßen verständlich erklärt  -wenn nicht bitte nachfragen

    Danke

    Daniel

    Montag, 21. November 2016 05:28

Antworten

  • Hallo Daniel,

    aus Deinen Schnipseln lässt sich zu wenig erkennen, was hinter den Kulissen passiert. Einige Codeausschnitte mehr wären hilfreich, z. B. was beim Laden geliefert wird.

    So muss z. B. eine Benachrichtigung stattfinden, wenn sich die KG_ID ändert. Aber auch wenn die Auflistung _cls.KündigungsgrundLaden sich ändert, d. h. neue, geänderte Daten enthält.

    Das geschieht, was Peter bereits angesprochen hat, über die Schnittstelle INotifyPropertyChanged für Eigenschaften bzw. INotifyCollectionChanged für Auflistungen. Das ist unabhängig davon, ob MVVM oder Eigenschaften im Fenster oder anderen Klassen verwendet werden. Ohne diese Voraussetzungen passiert nichts, wenn sich die Daten ändern.

    Für Auflistungen ist eine ObservableCollection vorzuziehen, weil sie die Schnittstelle bereitstellt. Bei Eigenschaften muss man dies implementieren, eine im Standard erzeugte Entity Framework Klasse und auch deren Auflistungen (z. B. DbSet) tun dies nicht.

    Gruß Elmar

    Montag, 21. November 2016 09:04
  • Hi Daniel,
    MVVM Anleitungen gibt es wirklich viele, weshalb auch eine Suchmaschine viele Treffer anzeigt, z.B.: MVVM Tutorial. Man kann einfach damit beginnen, den gesamten CodeBehind in eine ViewModel Klasse auszulagern. Dem XAML spendiert man einen Verweis auf die ViewModel Instanz als DataContext. Für die Command-Bindung nutzt man die Relay-Klasse und entsprechende ReadOnly ICommand-Eigenschaften im ViewModel. Für den seltenen Fall, wenn der ViewModel etwas von der Ansicht kennen muss, kann man ein angehängtes Verhalten (attached behavior) anwenden.

    --
    Viele Grüsse
    Peter Fleischer (MVP Reconnect, Partner)
    Meine Homepage mit Tipps und Tricks

    Montag, 21. November 2016 09:53

Alle Antworten

  • Hi Daniel,
    was ist bei Dir ein Detail Fenster? Was "Grund", der nicht angezeigt wird?  Was hat die TextBox mit der ComboBox zu tun?

    --
    Viele Grüsse
    Peter Fleischer (MVP Reconnect, Partner)
    Meine Homepage mit Tipps und Tricks

    Montag, 21. November 2016 05:57
  • Hallo Peter. Ich habe ein Hauptfenster ("Übersicht") wenn man so sagen will. Dort steht der Kunde und da ist ein Datagrid, was alle Kündigungen zu diesem Kunden zeigt. Wenn ich dann auf die Kündigung klicke, springt er ins "Detail Fenster" - da sind dann verschiedene Parameter zu der Kündigung (Eingangsdatum, Grund, Bemerkung usw...)

    Wenn ich eine neue Kündigung erfasse, werden alle Kündigungsgründe geladen. Wenn ich jedoch einen vorhandene anzeigen will, wird mir nichts angezeigt.

    Die TextBox hat nichts damit u tun. hab ich scheinbar mitkopiert und nicht bemerkt *hmpf*

    Gruß Daniel

    Montag, 21. November 2016 06:17
  • Hi Daniel,
    ich weiß nicht, wie Du die Information verwaltest.

    Ich nehme in WPF MVVM. Damit gibt es einen ViewModel, den ich sowohl für das Hauptfenster als auch für das Detail-Fenster als DataContext nutze. Wenn im Hauptfenster auf die Kündigung geklickt wird, wird im ViewModel einer Eigenschaft des dazugehörende Datenobjekt zugewiesen und ggf. noch mit NotifyPropertyChanged die Änderung signalisiert. Im Detail-Fenster wird dieses Objekt gebunden, z.B. in einem Panel mit den Feldern für die verschiedenen Parameter.

    Wenn bei dieser Arbeitsweise eine Anzeige aussteht, such ich im ViewModel, ob da etwas nicht richtig zugewiesen wurde. 


    --
    Viele Grüsse
    Peter Fleischer (MVP Reconnect, Partner)
    Meine Homepage mit Tipps und Tricks

    Montag, 21. November 2016 06:27
  • Hi Peter,

    nein ein MVVM habe ich leider nicht.

    Das sollte ich mir mal zu genüge führen

    Montag, 21. November 2016 07:48
  • Hi Daniel,
    solange Du nur mit CodeBehind arbeitest (ohne MVVM) kann es bei unterschiedlichen Objekten (Fenstern) recht schwierig werden, deren Inhalte zu synchronisieren. Solange nicht erkennbar ist, wie Du beide Fensterinhalte synchronisierst, ist es schwer, die Ursache des Problems zu finden.

    --
    Viele Grüsse
    Peter Fleischer (MVP Reconnect, Partner)
    Meine Homepage mit Tipps und Tricks

    Montag, 21. November 2016 08:13
  • Hi Peter,

    naja synchronisieren tu ich ja nichts. Ich war der Meinung das beim Binden der Wert dann automatisch gesetzt wird.

    Bzw. ähnlich wie bei WinForms = combobox.selectedvalue = 4 z.B. Und dann wird die Bezeichnung zu 4 angezeigt

    Montag, 21. November 2016 08:37
  • Hi Daniel,
    natürlich ist das auch im CodeBehind einer WPF Anwendung möglich. Damit das aber richtig funktioniert, muss sowohl der übergebene Wert richtig sein und die Combobox auch richtig gefüllt sein. Ist das bei Dir so? Ohne MVVM ist da etwas umständlich prüf- und verfolgbar.

    --
    Viele Grüsse
    Peter Fleischer (MVP Reconnect, Partner)
    Meine Homepage mit Tipps und Tricks

    Montag, 21. November 2016 08:57
  • Hallo Daniel,

    aus Deinen Schnipseln lässt sich zu wenig erkennen, was hinter den Kulissen passiert. Einige Codeausschnitte mehr wären hilfreich, z. B. was beim Laden geliefert wird.

    So muss z. B. eine Benachrichtigung stattfinden, wenn sich die KG_ID ändert. Aber auch wenn die Auflistung _cls.KündigungsgrundLaden sich ändert, d. h. neue, geänderte Daten enthält.

    Das geschieht, was Peter bereits angesprochen hat, über die Schnittstelle INotifyPropertyChanged für Eigenschaften bzw. INotifyCollectionChanged für Auflistungen. Das ist unabhängig davon, ob MVVM oder Eigenschaften im Fenster oder anderen Klassen verwendet werden. Ohne diese Voraussetzungen passiert nichts, wenn sich die Daten ändern.

    Für Auflistungen ist eine ObservableCollection vorzuziehen, weil sie die Schnittstelle bereitstellt. Bei Eigenschaften muss man dies implementieren, eine im Standard erzeugte Entity Framework Klasse und auch deren Auflistungen (z. B. DbSet) tun dies nicht.

    Gruß Elmar

    Montag, 21. November 2016 09:04
  • Hi Daniel,
    natürlich ist das auch im CodeBehind einer WPF Anwendung möglich. Damit das aber richtig funktioniert, muss sowohl der übergebene Wert richtig sein und die Combobox auch richtig gefüllt sein. Ist das bei Dir so? Ohne MVVM ist da etwas umständlich prüf- und verfolgbar.

    --
    Viele Grüsse
    Peter Fleischer (MVP Reconnect, Partner)
    Meine Homepage mit Tipps und Tricks

    Hi Peter,

    ja die Combobox ist richtig gefüllt, sonst würde ja beim neuen Eintrag auch keine Daten angezeigt werden oder?

    Gibt es denn ein gutes MVVM Tutorial für VB irgendwo?

    Gruß Daniel

    Montag, 21. November 2016 09:23
  • Hi Daniel,
    MVVM Anleitungen gibt es wirklich viele, weshalb auch eine Suchmaschine viele Treffer anzeigt, z.B.: MVVM Tutorial. Man kann einfach damit beginnen, den gesamten CodeBehind in eine ViewModel Klasse auszulagern. Dem XAML spendiert man einen Verweis auf die ViewModel Instanz als DataContext. Für die Command-Bindung nutzt man die Relay-Klasse und entsprechende ReadOnly ICommand-Eigenschaften im ViewModel. Für den seltenen Fall, wenn der ViewModel etwas von der Ansicht kennen muss, kann man ein angehängtes Verhalten (attached behavior) anwenden.

    --
    Viele Grüsse
    Peter Fleischer (MVP Reconnect, Partner)
    Meine Homepage mit Tipps und Tricks

    Montag, 21. November 2016 09:53