2012-07-02 6 views
0

У меня есть список в приложении Silverlight. ListBox:Не удается удалить элементы списка из списка

<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:

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 называется элемент добавлен в список. Но я также должен быть в состоянии удалить элементы из ListBox Так я думал, что это будет достаточно легко, поэтому я создал еще один суб

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 

Это работает без ошибок, но он не удаляет элемент из ListBox.

Что я делаю неправильно?

ответ

0

Ваш метод RemoveHazListItem, как представляется, создает новый объект vw_HazList_By_TaskID, вставляя в него пару значений и пытаясь удалить этот вновь созданный объект из вашей коллекции. Кажется, вы не получаете ожидаемое поведение, потому что пытаетесь удалить из коллекции элемент, который никогда не добавлялся к нему.

Насколько я могу видеть, есть два пути решения вашей проблемы:

  1. Override Equals в вашем vw_HazList_By_TaskID классе. Это должно позволить новым объектам считаться равными существующим объектам в коллекции, и, следовательно, вы должны иметь возможность удалять объекты из коллекции, передавая Remove объект, который совпадает с тем, который вы хотите удалить.

  2. Посмотрите через коллекцию для vw_HazList_By_TaskID объекта с соответствием iHazID и sHaz_Name свойств, и удалить этот объект из коллекции вместо этого.

Кстати, Remove метод класса ObservableCollection(Of T) возвращает значение, указывающее Boolean было ли оно в состоянии удалить значение из списка. В случае удаления элемента, который не найден, он возвращает False, а не бросает исключение.

0

Try так:

HazListByTaskIDCollection.RemoveAt(HazListByTaskIDCollection.IndexOf(yyy)); 
Смежные вопросы