Hallo allerseits an diesem wunderschön grauen Novembertag,
nach längerer Zwangspause bin ich mal wieder online
ich habe ein Problem mit einer Filterlogik, bzw. zweier Filterlogiken im Zusammenspiel. Ich glaube jedenfalls es liegt an der Filterlogik, kann aber auch andere Ursachen haben...
Der Zusammenhang ist recht komplex, aber ich versuch mal mein Bestes das zu erklären:
Ich habe drei Listboxen: Interpeten, Alben und Musiktitel. Diese sind jeweils an CollectionViews gebunden:
Die relevanten Filerlogiken der CollectionViews sehen so aus:
Diese Properties sind an die
Nun sollen, wenn ein Interpret in der Listbox ausgewählt wird, alle Alben und Musiktitel des jeweiligen Interpreten in den entsprechenden anderen Listboxen angezeigt werden.
Und dazu: Wenn ein Album ausgewählt wird, alle Musiktitel...
Funktioniert auch, beim ersten Mal. Aber wenn ich ein Album aussuche und dann wieder einen Interpret, scheint die Listbox mit den Musiktiteln nicht sichtbar aktualisiert zu werden... Die der Alben aber schon. Ich glaube da kommt sich gegenseitig was in die Quere...
So, ich hoffe, ich habe alle relevanten Codestellen gepostet, aber ich habe mit Sicherheit was vergessen. Zur Sicherheit lade ich das Projekt mal hoch, dann kann man auch ausprobieren, was ich meine... Der relevante Code ist in der SucheViewModel.vb
nach längerer Zwangspause bin ich mal wieder online
ich habe ein Problem mit einer Filterlogik, bzw. zweier Filterlogiken im Zusammenspiel. Ich glaube jedenfalls es liegt an der Filterlogik, kann aber auch andere Ursachen haben...
Der Zusammenhang ist recht komplex, aber ich versuch mal mein Bestes das zu erklären:
Ich habe drei Listboxen: Interpeten, Alben und Musiktitel. Diese sind jeweils an CollectionViews gebunden:
AnzuzeigendeInterpreten
, AnzuzeigendeAlben
und AnzuzeigendeMusiktitel
.Die relevanten Filerlogiken der CollectionViews sehen so aus:
VB.NET-Quellcode
- Private Function AnzuzeigendeAlben_Filter(obj As Object) As Boolean
- Dim Objekt As MP3FileInfo = DirectCast(obj, MP3FileInfo)
- Dim IstErlaubt = Not Objekt.Stream
- If Not IstErlaubt Then Return IstErlaubt
- If Not String.IsNullOrEmpty(TextFilter) Then
- IstErlaubt = Objekt.Interpret.ToLower.Contains(TextFilter) OrElse Objekt.Album.ToLower.Contains(TextFilter)
- If Not IstErlaubt Then Return IstErlaubt
- ElseIf AusgewählterInterpret IsNot Nothing Then
- If Objekt.Interpret = _AusgewählterInterpret.Interpret Then
- IstErlaubt = True
- Else
- IstErlaubt = False
- End If
- If Not IstErlaubt Then Return IstErlaubt
- End If
- For Each selGenre In AnzuzeigendeGenres.Where(Function(g) Not g.IstSelektiert)
- If Objekt.Genre = selGenre.Genre Then Return False
- Next
- Return IstErlaubt
- End Function
- Private Function AnzuzeigendeMusiktitel_Filter(obj As Object) As Boolean
- Dim Objekt As MP3FileInfo = DirectCast(obj, MP3FileInfo)
- Dim IstErlaubt = Not Objekt.Stream
- If Not IstErlaubt Then Return IstErlaubt
- If Not String.IsNullOrEmpty(TextFilter) Then
- IstErlaubt = Objekt.Interpret.ToLower.Contains(TextFilter) OrElse Objekt.Album.ToLower.Contains(TextFilter) OrElse Objekt.Musiktitel.ToLower.Contains(TextFilter)
- ElseIf AusgewähltesAlbum IsNot Nothing AndAlso AusgewählterInterpret Is Nothing Then
- If Objekt.Album = _AusgewähltesAlbum.Album Then
- IstErlaubt = True
- Else
- IstErlaubt = False
- End If
- ElseIf AusgewähltesAlbum Is Nothing AndAlso AusgewählterInterpret IsNot Nothing Then
- If Objekt.Interpret = _AusgewählterInterpret.Interpret Then
- IstErlaubt = True
- Else
- IstErlaubt = False
- End If
- ElseIf AusgewähltesAlbum IsNot Nothing AndAlso AusgewählterInterpret IsNot Nothing Then
- If Objekt.Album = _AusgewähltesAlbum.Album Then
- IstErlaubt = True
- Else
- IstErlaubt = False
- End If
- End If
- If Not IstErlaubt Then Return IstErlaubt
- For Each selGenre In AnzuzeigendeGenres.Where(Function(g) Not g.IstSelektiert)
- If Objekt.Genre = selGenre.Genre Then Return False
- Next
- Return IstErlaubt
- End Function
Diese Properties sind an die
.SelectedItem
der Listboxen gebunden:VB.NET-Quellcode
- Public Property AusgewählterInterpret As MP3FileInfo
- Get
- Return _AusgewählterInterpret
- End Get
- Set(value As MP3FileInfo)
- If value IsNot Nothing Then
- AusgewähltesAlbum = Nothing
- _AusgewählterInterpret = value
- RaisePropertyChanged()
- AnzuzeigendeAlben.Refresh()
- AnzuzeigendeMusiktitel.Refresh()
- End If
- End Set
- End Property
- Public Property AusgewähltesAlbum As MP3FileInfo
- Get
- Return _AusgewähltesAlbum
- End Get
- Set(value As MP3FileInfo)
- If value IsNot Nothing Then
- _AusgewähltesAlbum = value
- RaisePropertyChanged()
- AnzuzeigendeMusiktitel.Refresh()
- MessageBox.Show("Album geändert")
- End If
- End Set
- End Property
Nun sollen, wenn ein Interpret in der Listbox ausgewählt wird, alle Alben und Musiktitel des jeweiligen Interpreten in den entsprechenden anderen Listboxen angezeigt werden.
Und dazu: Wenn ein Album ausgewählt wird, alle Musiktitel...
Funktioniert auch, beim ersten Mal. Aber wenn ich ein Album aussuche und dann wieder einen Interpret, scheint die Listbox mit den Musiktiteln nicht sichtbar aktualisiert zu werden... Die der Alben aber schon. Ich glaube da kommt sich gegenseitig was in die Quere...
So, ich hoffe, ich habe alle relevanten Codestellen gepostet, aber ich habe mit Sicherheit was vergessen. Zur Sicherheit lade ich das Projekt mal hoch, dann kann man auch ausprobieren, was ich meine... Der relevante Code ist in der SucheViewModel.vb