Problem mit ListBox und ViewModel

  • WPF

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    Problem mit ListBox und ViewModel

    Hallo liebe Community,
    ich hänge mal wieder an was fest, nämlich funktioniert eine ListBox nicht wie erwartet :S, sie zeigt nämlich gar nichts an außer den leeren Items.
    So siehts momentan aus:

    XAML:

    XML-Quellcode

    1. <ListBox Name="LinkListBox" ItemsSource="{Binding Path=.}">
    2. <ListBox.ItemTemplate>
    3. <DataTemplate>
    4. <Grid>
    5. <StackPanel Orientation="Horizontal" >
    6. <TextBlock Text="{Binding Name}" Foreground="Black"/>
    7. <TextBlock Text="{Binding Destination}" Foreground="Black"/>
    8. </StackPanel>
    9. </Grid>
    10. </DataTemplate>
    11. </ListBox.ItemTemplate>
    12. </ListBox>

    MainWindow VB:

    VB.NET-Quellcode

    1. Private _Links As New ObservableCollection(Of LinkViewModel)
    2. Public Property Links As ObservableCollection(Of LinkViewModel)
    3. Get
    4. Return _Links
    5. End Get
    6. Set(value As ObservableCollection(Of LinkViewModel))
    7. _Links = value
    8. End Set
    9. End Property
    10. Public Sub New()
    11. InitializeComponent()
    12. For X As Integer = 1 To 50 '20 Links zuweisen (Testweise)
    13. Me.Links.Add(New LinkViewModel(New Link("Testdestination", "www.testdest.de", "[url='www.testdest.de']Unsere Testdestination[/url]")))
    14. Next
    15. LinkListBox.ItemsSource = Me.Links
    16. End Sub

    Link VB:

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.Collections.ObjectModel
    3. Public Class LinkViewModel
    4. Implements INotifyPropertyChanged
    5. Private _Link As Link
    6. Public Property Link() As Link
    7. Get
    8. Return _Link
    9. End Get
    10. Set(value As Link)
    11. If value IsNot _Link Then
    12. _Link = value
    13. NotifyPropertyChanged("Link")
    14. End If
    15. End Set
    16. End Property
    17. Public Sub New(link As Link)
    18. Me.Link = link
    19. NotifyPropertyChanged("Link")
    20. End Sub
    21. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    22. Protected Sub NotifyPropertyChanged(info As String)
    23. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
    24. End Sub
    25. End Class
    26. Public Class Link
    27. Public Property Name As String
    28. Public Property Destination As String
    29. Public Property BBCode As String
    30. Public Property Description As String
    31. Public Sub New(name As String, destination As String, bbcode As String)
    32. Me.New(name, destination, bbcode, "")
    33. End Sub
    34. Public Sub New(name As String, destination As String, bbcode As String, description As String)
    35. Me.Name = name
    36. Me.Destination = destination
    37. Me.BBCode = bbcode
    38. Me.Destination = description
    39. End Sub
    40. End Class

    Seht ihr irgendeinen Fehler?
    Nimm mal das Template raus, überschreibe die ToString-Methode im Model und schau ob er was anzeigt. Außerdem wie sieht dein DataContext aus? Bist du sicher, dass Path=. richtig ist?


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @thefiloe
    Ok, damit zeigts was an, zumindest, wenn ich die ToString-Methode im VM überschreibe. Zum anderen: Keine Ahnung, jedenfalls funktioniert es auch, ohne die ItemsSource-Eigenschaft zu bearbeiten genauso.
    Gut. Dann stimmt zumindest die ItemsSource. Dann hängt es am Template. Gib dem DataTemplate mal nen TargetType. Dazu zuerst oben den namespace importieren z.b. xmlns:model=... und dann einfach

    XML-Quellcode

    1. <DataTemplate TargetType={model:Link}>
    Anschließend solltest du beim TextBlock über den Editor(PropertyGrid -> Eigenschaftenfenster) die Bindings setzen können. Überprüfe ob deine Eigenschaften auch wirklich Werte haben. Schau im Ausgabefenster von Visual Studio nach ob irgendwo Bindingfehler aufgelistet werden oder setze in den jeweiligen Eigenschaften Breakpoints.

    Außerdem solltest du für jede Eigenschaft in der Link-Klasse auch das INotifyPropertyChanged-interface verwenden.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    TE schrieb:

    Ich weiß leider nicht, was du damit meinst
    Ah - jetzt kommts raus: Was ich sage wird nicht verstanden, und statt nachzufragen werd ich ignoriert.

    Auch nicht zielführend, denn wenn ich richtig liege, geht ja nix drumrum um was ich sage.

    Nu guck dir doch endlich mal das verlinkte Tut an, da wird doch gezeigt, wie man Bindings überprüft.
    Ich hab mal ne Frage:
    Ist es nicht im Sinne vom MVVM, dass die Logik (das Model) keinen Zugriff auf das Fenster hat, also theoretisch auch ohne das Fenster (den View) funktionieren würde?
    Mfg
    Vincent

    Natürlich ist es im Sinne von MVVM und wird auch so gemacht. In der Praxis werden oft ViewModel und Model in externe Libs ausgelagert. Es können dann z.B. ViewModel von Unittests automatisiert getestet werden oder man verwendet das Model von mir aus noch in einer ASP.NET Anwendung oder in einem Server welche die selben Models verwendet(z.B. eine Datenbankanbindung).


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.