WPF: ListBox Databinding

C-H

Erfahrenes Mitglied
Hallo!

Ich habe eine Listbox deren Items 2 Textboxen enthalten (Eine innerhalb eines Expanders).

Denen möchte ich per Databinding Daten zuweisen. Diese erhalte ich, indem ich eine Text-Datei (Protokoll) lese und bestimmte Daten in eine Liste schreibe.

Meine Frage jetzt: Wie bekomme ich die Daten in die Listbox?

xaml-Code:

Code:
<Page x:Class="Page1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Page1">
<Grid Height="326" Width="586" HorizontalAlignment="Left">
<Image Name="imgHeader" Stretch="Fill" Height="43" VerticalAlignment="Top" Source="/LogInterpreter;component/Images/header_background.gif" />
<Label Height="43" Name="lblHeader" VerticalAlignment="Top" FontSize="16" FontWeight="Bold" Foreground="White" VerticalContentAlignment="Center">NT Backup Log Graphical Interpreter</Label>
<Label Height="28" Margin="132,51,0,0" Name="lblUser" VerticalAlignment="Top" HorizontalAlignment="Left" Width="120">SYSTEM</Label>
<Label Height="28" HorizontalAlignment="Right" Margin="0,51,0,0" Name="lblBackupStatus" VerticalAlignment="Top" Width="135">Sicherung erfolgreich</Label>
<Label Height="28" Name="lblDateTime" Margin="0,51,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="135">04.06.2008, 23:00 Uhr</Label>
<Image Margin="0,51,135,0" Name="imgBackupStatus" Stretch="Fill" Width="25" Height="25" HorizontalAlignment="Right" VerticalAlignment="Top" Source="/LogInterpreter;component/Images/check_green_big.gif" />
<ListBox Margin="0,80,0,0" Name="ListBox1" ItemsSource="{Binding Path=backup_info}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Height="21" Text="{Binding Path=backupInfoGeneral}" />
<Expander Header="Detail anzeigen" Margin="0,0,0,0" HorizontalAlignment="Left" Height="85" VerticalAlignment="Top">
<TextBlock Height="21" Width="120" Text="{Binding Path=backupInfoDetail}"/>
</Expander>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Page>

Code-Behind (vb.net):
Code:
Class Page1 
PrivateSub Page1_Initialized(ByVal sender AsObject, ByVal e As System.EventArgs) HandlesMe.Initialized
Dim backup_info AsNew backupInfo
backup_info.Add(New backupInfoItem("A", "B"))
backup_info.Add("C", "D")
EndSub
EndClass
PublicClass backupInfoItem
Private m_backupInfoGeneral AsString
Private m_backupInfoDetail AsString
PublicSubNew(ByVal backupInfoGeneral AsString, ByVal backupInfoDetail AsString)
m_backupInfoGeneral = backupInfoGeneral
m_backupInfoDetail = backupInfoDetail
EndSub
PublicOverridesFunction ToString() AsString
Return m_backupInfoGeneral & " " & m_backupInfoDetail
EndFunction
EndClass
PublicClass backupInfo
Inherits List(Of backupInfoItem)
PublicOverloadsSub Add(ByVal backupInfoGeneral AsString, ByVal backupInfoDetail AsString)
Dim item AsNew backupInfoItem(backupInfoGeneral, backupInfoDetail)
MyBase.Add(item)
EndSub
EndClass
 
ItemsSource="{Binding Path=backup_info}" ist schlichtweg nicht korrekt. Entweder holst du dir die anzuzeigenden Daten über eine Ressource in dein XAML und verwendest StaticResource oder du weist per Sourcecode der ItemsSource-Eigenschaft deine Daten zu. Da musst du allerdings eine Collection hineinpacken. Aktuell passiert gar nichts in diese Richtung.
 
Hi Ihr!

Ich hab in etwa das selbe Probelm. Ich beschreib mal meins, vielleicht hilft das auch C-H.
Ich habe eine eigene Datenstrucktur und binde diese an eine ListBox. Wenn ich in meine Liste Werte zur Laufzeit hinzufüge werden diese nicht angezeigt, sind aber in der Liste enthalten (nodes.count >1). Kurrios ist, dass wenn ich in der Routine "Window_FlowGrid_Loaded" meine Liste fülle, diese Werte auch angezeigt werden. Alle anderen, die ich später hinzufüge werden nicht visualisiert.
Was ich also bräuchte, wäre eine Art "Requary()" um der ListBox zusagen, sie soll ihren Inhalt erneuern. Aber wie mach ich das?

Also: Ich habe eine Klasse Nodes:
Code:
Public Class Node
    Private node_name As String
    Private m_state As MyState

    Sub New()
        node_name = ""
        m_state = MyState.unknown
    End Sub
    Sub New(ByVal name As String, ByVal state As MyState)
        node_name = name
        m_state = state
    End Sub
    Public Property Node_Label() As String
        Get
            Return node_name
        End Get
        Set(ByVal value As String)
            node_name = value
        End Set
    End Property

    Public Property State() As MyState
        Get
            Return m_state
        End Get
        Set(ByVal value As MyState)
            m_state = value
        End Set
    End Property    
End Class

sowie eine "Collection-Klasse":
Code:
Public Class NodeList
    Inherits List(Of NodeItem)

    Public Overloads Sub Add(ByVal name As String, ByVal state As MyState)
                Dim nodeItem As New NodeItem(name, state)
                MyBase.Add(nodeItem)
    End Sub

    Public Overloads Sub Add(ByVal item As NodeItem)        
                MyBase.Add(item)
    End Sub

    Public Sub Delete(ByVal item As String)
        ....
    End Sub

End Class

Meine xmal sieht dann so aus:
Code:
<ListBox Name="listSourceNodes"  ItemsSource="{Binding}" DisplayMemberPath="Node_Label"  />

und im Code-Behind weise ich das ganze so zu:
Code:
Private Sub Window_Test_Loaded(...........
NodeList l as new NodeList()
'l.add("test1",MyState.added) <- füge ich diese Zeile ein, wird diese angezeigt
me.listSourceNodes.Datacontext=l 'ich weiß die liste ist hier leer
End Sub

'bei einem buttonClick wird dieser Code aufgerufen..
Private Sub cbxDul_Click(.......
Dim nodes As NodeItemList = list.DataContext
nodes.Add("myString", MyState.added)
'list.DataContext = nodes
list.UpdateLayout()
End Sub

Ich hoffe, das war soweit verständlich. Und ich bin sicher, das meine Lösung dann auch C-H helfen wird.
Mir ist auch egal, ob jemand C# Code-Schnippsel postet. Das umschreiben ist nicht das Problem. Naja und XAML ist auch willkommen...

Grüße
 
Du leitest einfach von "System.Collections.ObjectModel.ObservableCollection" anstatt von "List" ab. Das implementiert nämlich INotifyPropertyChanged, welches die ListBox braucht, damit sie merkt, dass was an den Elementen in der Collection passiert ist.
 

Neue Beiträge

Zurück