0

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

次に、ビューモデルにサブがあります:

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

これはエラーなしで実行されますが、リストボックスからアイテムを削除しません。

私は何を間違っていますか?

4

2 に答える 2

0

このようにしてみてください:

HazListByTaskIDCollection.RemoveAt(HazListByTaskIDCollection.IndexOf(yyy));
于 2012-07-03T09:43:07.257 に答える
0

あなたのRemoveHazListItemメソッドは、新しいvw_HazList_By_TaskIDオブジェクトを作成し、それにいくつかの値を入れて、この新しく作成されたオブジェクトをコレクションから削除しようとしているようです。コレクションに追加されたことのないアイテムをコレクションから削除しようとしているため、期待どおりの動作が得られないようです。

私が見る限り、あなたの問題には2つの解決策があります:

  1. クラスでオーバーライドEqualsします。これを行うと、新しいオブジェクトがコレクション内の既存のオブジェクトと等しいと見なされるようになるため、削除したいオブジェクトと等しいオブジェクトにvw_HazList_By_TaskID渡すことで、コレクションからオブジェクトを削除できるはずです。Remove

  2. vw_HazList_By_TaskID一致するiHazIDおよびプロパティを持つオブジェクトのコレクションをsHaz_Name調べ、代わりにそのオブジェクトをコレクションから削除します。

ちなみに、クラスのRemoveメソッドは、リストから値を削除できたかどうかを示す値を返します。削除するアイテムが見つからない場合は、例外をスローするのではなく、戻ります。ObservableCollection(Of T)BooleanFalse

于 2012-07-02T20:57:09.677 に答える