我在Silverlight应用程序中有一个列表框。 列表框:
<ListBox Grid.Row="1" Grid.ColumnSpan="2" Name="lbHazards" Margin="5"
MinHeight="75" ItemsSource="{Binding Path=HazListByTaskIDCollection}"
DisplayMemberPath="sHaz_Name"
IsEnabled="{Binding Path=IsEnabled}" />
在视图模型中我有
Private _HazListByTaskIDCollection As ObservableCollection(Of vw_HazList_By_TaskID)
Public Property HazListByTaskIDCollection() As ObservableCollection(Of vw_HazList_By_TaskID)
Get
Return _HazListByTaskIDCollection
End Get
Set(ByVal value As ObservableCollection(Of vw_HazList_By_TaskID))
_HazListByTaskIDCollection = value
'Used to notify CommonBase class that a property change has occured
RaisePropertyChanged("HazListByTaskIDCollection")
End Set
End Property
然后我在viewmodel中有一个sub:
Public Sub FillHazList(ByVal iHazID As Integer, ByVal sHaz_Name As String)
Try
Dim yy = New vw_HazList_By_TaskID
yy.iHazID = iHazID
yy.sHaz_Name = sHaz_Name
HazListByTaskIDCollection.Add(yy)
Catch ex As Exception
DisplayError("Error Happened", ex)
End Try
End Sub
当调用此Sub时,该项将被添加到列表框中。 但我还需要能够从列表框中删除项目 所以我认为这很容易,所以我创建了另一个子
Public Sub RemoveHazListItem(ByVal iHazID As Integer, ByVal sHaz_Name As String)
Try
Dim yyy = New vw_HazList_By_TaskID
yyy.iHazID = iHazID
yyy.sHaz_Name = sHaz_Name
HazListByTaskIDCollection.Remove(yyy)
HazListByTaskIDCollection.Clear()
Catch ex As Exception
DisplayError("Error Happened", ex)
End Try
End Sub
这样运行时没有错误,但它不会从列表框中删除该项目。
我做错了什么?
答案 0 :(得分:0)
您的RemoveHazListItem
方法似乎正在创建一个新的vw_HazList_By_TaskID
对象,在其中放入几个值,并尝试从您的集合中删除这个新创建的对象。您似乎没有得到您期望的行为,因为您试图从集合中删除从未添加到其中的项目。
据我所知,您的问题有两种解决方案:
覆盖Equals
课程中的vw_HazList_By_TaskID
。这样做应该允许新对象被认为与集合中的现有对象相等,因此您应该能够通过向Remove
传递与您要删除的对象相等的对象来从集合中删除对象。
在集合中查找具有匹配的vw_HazList_By_TaskID
和iHazID
属性的sHaz_Name
对象,然后从集合中删除该对象。
顺便提一下,ObservableCollection(Of T)
类的Remove
方法返回Boolean
值,表示是否能够从列表中删除值。如果要删除的项目未找到,则返回False
而不是抛出异常。
答案 1 :(得分:0)
试试这样:
HazListByTaskIDCollection.RemoveAt(HazListByTaskIDCollection.IndexOf(yyy));