Binding Listbox

  • WPF

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Binding Listbox

    Hi,

    Ich möchte eine OberservableCollection(of FileInfo) an eine Listbox binden und den FileName anzeigen lassen. Soweit bin ich:
    MainWindow.xaml.vb

    VB.NET-Quellcode

    1. Imports System.Collections.ObjectModel
    2. Imports System.IO
    3. Class MainWindow
    4. Private Sub OpenSettings(sender As Object, e As RoutedEventArgs) Handles btnSettings.Click
    5. PropertyClass.Instance.ImgList.Add(New FileInfo("C:\test.jpg"))
    6. End Sub
    7. Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    8. ListImages.DataContext = PropertyClass.Instance.ImgList
    9. End Sub
    10. End Class

    PropertyClass.vb

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.Collections.ObjectModel
    3. Imports System.IO
    4. Public Class PropertyClass
    5. Implements INotifyPropertyChanged
    6. Public Event PropertyChanged As PropertyChangedEventHandler _
    7. Implements INotifyPropertyChanged.PropertyChanged
    8. Private Sub NotifyPropertyChanged(ByVal info As String)
    9. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
    10. End Sub
    11. Dim _currentImage As Image = Nothing
    12. Public Property CurrentImage As Image
    13. Get
    14. Return _currentImage
    15. End Get
    16. Set(value As Image)
    17. _currentImage = value
    18. NotifyPropertyChanged("CurrentImage")
    19. End Set
    20. End Property
    21. Dim _imgList As New ObservableCollection(Of FileInfo)
    22. Public Property ImgList As ObservableCollection(Of FileInfo)
    23. Get
    24. Return _imgList
    25. End Get
    26. Set(value As ObservableCollection(Of FileInfo))
    27. If Not _imgList.Equals(value) Then
    28. _imgList = value
    29. NotifyPropertyChanged("ImgList")
    30. End If
    31. End Set
    32. End Property
    33. Private Shared _instance As PropertyClass
    34. Public Shared ReadOnly Property Instance As PropertyClass
    35. Get
    36. If _instance Is Nothing Then _instance = New PropertyClass
    37. Return _instance
    38. End Get
    39. End Property
    40. End Class

    Auschnitt MainWindow.xaml

    VB.NET-Quellcode

    1. <ListBox Name="ListImages" Grid.Row="2" Grid.Column="1" BorderThickness="1" ItemsSource="{Binding ImgList}">
    2. <ListBox.ItemTemplate>
    3. <DataTemplate>
    4. <TextBlock Text="{Binding FileName}"></TextBlock>
    5. </DataTemplate>
    6. </ListBox.ItemTemplate>
    7. </ListBox>


    Was passt hier nicht? Muss ich das "dreckig" machen, indem ich die Listbox direkt anspreche, denn das wäre ja gegen den Sinn der PropertyClass....?

    8-) faxe1008 8-)
    Letztendlich musst du dein ViewModel als DataContext des MainWindows setzten. Also:

    XML-Quellcode

    1. xmlns:my="Der_Namespace_der_Anwendung"
    2. DataContext="{x:Static my:PropertyClass.Instance}"


    Also nix

    VB.NET-Quellcode

    1. ListImages.DataContext = PropertyClass.Instance.ImgList
    Mfg
    Vincent

    Im Zusammenhang mit dem Binding Problem hier trat ein neues auf:

    Ich binde eine ObservableCollection(of UserProfile) an die Listbox. Die Listbox soll die einzelnen Profile als Radiobuttons darstellen, damit im späteren Verlauf eersichtlich ist, welches Profil ausgewählt wurde.Hierzu verfügt jedes Profil über die Eigenschaft IsSelected. Nun lassen sich allerdings mehrere Radiobuttons aufeinmal checken, was ja nicht beasichtigt ist.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. <ListBox Name="lstprofiles" Grid.Row="1" Margin=" 3,5,2,10" ItemsSource="{Binding Profiles}" SelectedIndex="{Binding SelectedProfileIndex}" Grid.RowSpan="10" >
    2. <ListBox.ItemTemplate>
    3. <DataTemplate>
    4. <RadioButton Content="{Binding Path=Name }" IsChecked="{Binding Path=IsSelected}" ></RadioButton>
    5. </DataTemplate>
    6. </ListBox.ItemTemplate>
    7. </ListBox>


    Wie schließe ich es aus, dass mehrere Radiobuttons gleichzeitig gechecked werden können?

    8-) faxe1008 8-)
    Listbox hat doch bereits Selector-Funktionalität (geerbt übrigens).
    Gestalte einfach "einfach" den ItemContainerStyle so, dasses wie RadioButton aussieht. Da brauchst du auch keine Extra IsSelected-Property im Viewmodel mit durchschleppen, denn das ListboxItem hat bereits eine solche, und die wird bereits vonne Listbox gesteuert.
    @ErfinderDesRades
    Bei dem Fenster handelt es sich um einen Dialog, dessen Einstellungen über XMLSerializer gesichert werden. Eine Möglichkeit ItemContainerStyle zu ändern habe ich nicht gefunden, und außerdem muss der SelectedIndex unabhängig vom für den weiteren Ablauf ausgewählten Profil sein, da zur Bearbeitung der SelectedIndex verwendet wird ;)
    Bilder
    • Unbenannt.PNG

      22,7 kB, 572×257, 160 mal angesehen

    8-) faxe1008 8-)