Here is a possible solution (full source)
Unit types
Namespace Classes
Public Enum Unit
SI
IM
End Enum
End Namespace
Container
Imports System.ComponentModel
Imports System.Runtime.CompilerServices
Namespace Classes
Public Class Box
Implements INotifyPropertyChanged
Private _unit As Unit
Private _length As Double
Public Property Length() As Double
Get
Return _length
End Get
Set
_length = Value
End Set
End Property
Public Property Width() As Integer
Public Property Unit() As Unit
Get
Return _unit
End Get
Set
_unit = Value
OnPropertyChanged()
If Unit = Unit.SI Then
Length *= 25.400013716
Else
Length *= 0.0393701
End If
End Set
End Property
Public Overrides Function ToString() As String
Return Length.ToString()
End Function
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Protected Overridable Sub OnPropertyChanged(<CallerMemberName> Optional ByVal propertyName As String = Nothing)
PropertyChangedEvent?.Invoke(Me, New PropertyChangedEventArgs(propertyName))
End Sub
End Class
End Namespace
Mocked data
Namespace Classes
Public Class MockedData
Public Shared Function Boxes() As List(Of Box)
Return New List(Of Box)() From {
New Box() With {
.Length = 25,
.Unit = Unit.IM
},
New Box() With {
.Length = 26,
.Unit = Unit.IM
},
New Box() With {
.Length = 27,
.Unit = Unit.IM
}
}
End Function
End Class
End Namespace
Form code
Note that each RadioButton has it's Tag property set eg.
Imports System.ComponentModel
Imports System.Windows.Forms
Imports Classes
Partial Public Class Form1
Inherits Form
Private ReadOnly _dataSource As New BindingList(Of Box)()
Public Sub New()
InitializeComponent()
_dataSource = New BindingList(Of Box)(MockedData.Boxes())
listBox1.DataSource = _dataSource
AdjustUnits()
AddHandler radioButtonIM.CheckedChanged, AddressOf RadioButtonOnCheckedChanged
AddHandler radioButtonSI.CheckedChanged, AddressOf RadioButtonOnCheckedChanged
End Sub
Private Sub RadioButtonOnCheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim rb = DirectCast(sender, RadioButton)
If rb IsNot Nothing Then
If rb.Checked Then
AdjustUnits()
End If
End If
End Sub
Private Sub AdjustUnits()
Dim unitType As String = Controls.OfType(Of RadioButton)().FirstOrDefault(Function(r) r.Checked).Tag.ToString()
Dim unit As Unit
[Enum].TryParse(unitType, unit)
For index As Integer = 0 To listBox1.Items.Count - 1
Dim item As Box = _dataSource(index)
item.Unit = unit
Next
End Sub
End Class