[英]Check if list has been modified
我試圖基本上使FlowLayoutPanel只接受我創建的繼承Button的自定義控件。 所以我已經隱藏了Controls屬性並且我創建了自己的屬性,但是我沒有將它聲明為ControlsCollection,而是將其聲明為列表:
Public Shadows ReadOnly Property Controls() As ControlCollection
Get
Return MyBase.Controls
End Get
End Property
Private itms As New List(Of MenuItem)
Public Property Items() As List(Of MenuItem)
Get
Return itms
End Get
Set(value As List(Of MenuItem))
itms = value
End Set
End Property
我所困擾的是如何檢查Items()屬性是否被修改,我可以調用類似的東西:
Me.Controls.Clear : Me.Controls.AddRange(itms.ToArray())
由於問題是通過公開Items
,可以添加東西,你可以刪除它並公開AddItem
和RemoveItem
類型方法:
Private _dataChanged As Boolean = False
Public Function AddItem(ByVal mi As MenuItem) As Integer
_items.Add(mi)
_dataChanged = True
return _items.Count
End Function
作為List(Of T)
它可以防止添加非T項目,但是您的控件並不是完全掌控項目列表,而是以這種方式暴露。 另一種方法可能是使用包含ListChanged
事件的BindingList:
Private WithEvents _items As New BindingList(Of MenuItem)
Private _dataChanged As Boolean = False ' maybe
AddHandler _items.ListChanged, AddressOf _listChanged
Public Property Items() As BindingList(Of MenuItem)
Get
Return itms
End Get
Set(value As List(Of MenuItem))
_items = value
End Set
End Property
'...
private Event _listChanged(ByVal sender As Object, _
ByVal e As ListChangedEventArgs)
_dataChanged = True
RoutineToDoSomethingAboutDataChanged()
End Sub
您可以通過ListChangedEventArgs
告知哪個項目已更改,因此您可以根據需要僅對已更改的項目執行某些操作。 Me.Controls.AddRange(itms.ToArray())
不會工作,因為BindingList不支持ToArray
方法。
還有,將它們移動到ControlCollection是什么意思? 這是序列化嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.