我有一个非常简单的类,它包含一些公共属性——ID、文本、颜色等和一个名为“SelectedItem”的布尔值。就像Checked
RadioButtons 上的属性一样,只有一个项目可以将其SelectedItem
属性设置为True
特定组内。注意:将有几个单独的组(列表),每个组只能有一个带有SelectedItem = True
.
我的第一个想法是,我可能只需要处理班级以外的所有内容,在选择其他项目时为特定列表中的所有其他项目SelectedItem
设置。False
但这对我来说似乎相当不雅。所以我一直在努力思考如何在课堂上做到这一点。例如:我是否可以有一个名为“GroupName”的私有字符串属性 - 在New
添加类的新实例时在子中设置 - 然后使用私有共享方法将每个项目的SelectedItem
属性设置为False
,前提是项目具有相同GroupName
作为新选择的项目?我会尝试这样做,但我不知道如何从该类中枚举该类的每个实例,或者这是否可能。是吗?还是有另一种(更好的)方法来实现我的目标?
编辑
感谢所有的建议和意见,他们都非常感谢。
根据 Tim 和 Cyborgx37 的评论,我决定听从他们的建议并使用 CollectionBase 作为项目管理器类。这是我到目前为止所拥有的精简版:
Public Class ResourceItem
Public ID As Integer
Public Text As String
Public SelectedItem As Boolean
End Class
Public Class ResourceItemsManager
Inherits System.Collections.CollectionBase
Public Sub Add(ByVal iID As Integer, ByVal sText As String)
Dim newResItem As New ResourceItem
With newResItem
.ID = iID
.Text = sText
End With
List.Add(newResItem)
End Sub
Default Public ReadOnly Property Item(ByVal Index As Integer) As ResourceItem
Get
If Index < Count And Index >= 0 Then
Return CType(List.Item(Index), ResourceItem)
Else
Return Nothing
End If
End Get
End Property
Public Sub ClearAll()
List.Clear()
End Sub
Public Sub SelectItem(ByVal Index As Integer)
If Index < Count And Index >= 0 Then
For i As Integer = 0 To List.Count - 1
List.Item(i).SelectedItem = i = Index
Next
Else
'Exception code here
End If
End Sub
End Class
可以看出:我没有实例化一个 newResourceItem
并将其作为参数传递给管理器的Add
过程,而是简单地传递了新项目的详细信息,并且该过程正在从中创建项目。我不知道这是个好主意还是坏主意-请告知-但我已经这样做了,因为我不知道如何使 SelectedItem 属性只能由经理写入,所以我想避免直接访问可以将其SelectedItem
属性设置为的对象,True
而无需取消选择同一组中的所有其他项目。当然,仍然有可能将变量设置为经理的列表项之一并从那里进行设置,所以我仍然想知道如果可能的话,我该如何防止这种情况发生。
更新
最后我没有使用上面的代码,而是决定使用 Cyborgx37 的解决方案——尽管有关于最佳实践的警告,这似乎对我来说效果很好。我还意识到我需要在另一个可以选择多个项目的场景中使用同一个类,因此很容易向管理器添加一个布尔属性来启用它。