将事件处理程序添加到 my.settings 值
Add an event handler to a my.settings value
我想在每次更改 My.Settings
中的值时调用一个方法。类似于:
Private Sub myValue_Changed(sender As Object, e As EventArgs) Handles myValue.Changed
(...)
End Sub
我知道,如果我想用一个变量来做,我必须把它变成 class 并在上面设置事件。但是我不能用 My.Settings
.
的值来做
有什么办法吗?
一句话:没有。 My.Settings
本身不支持此功能。
你可以做的是制作你自己的 class 来包装 My.Settings
。只要你使用这个新的 class,并且不再直接去 My.Settings
,那么你可以在那个 class 上放置一个事件,它将满足你的需要。
然而,即使在这里,也无法强制 使用新的 class,并阻止直接访问 My.Settings
.
正如另一个答案的评论中所建议的,您可以通过 Binding
接收设置更改通知。或者,您基本上可以做 Binding
class 自己做的事情,因为它并没有那么多,例如
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim settingsPropertyDescriptors = TypeDescriptor.GetProperties(My.Settings)
Dim setting1PropertyDescriptor = settingsPropertyDescriptors(NameOf(My.Settings.Setting1))
setting1PropertyDescriptor.AddValueChanged(My.Settings, AddressOf Settings_Setting1Changed)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
My.Settings.Setting1 = "Hello World"
End Sub
Private Sub Settings_Setting1Changed(sender As Object, e As EventArgs)
Debug.WriteLine($"{NameOf(My.Settings.Setting1)} changed to ""{My.Settings.Setting1}""")
End Sub
此代码通过 PropertyDescriptor
将更改的处理程序添加到 属性,就像 Binding
class 所做的那样。
我想在每次更改 My.Settings
中的值时调用一个方法。类似于:
Private Sub myValue_Changed(sender As Object, e As EventArgs) Handles myValue.Changed
(...)
End Sub
我知道,如果我想用一个变量来做,我必须把它变成 class 并在上面设置事件。但是我不能用 My.Settings
.
有什么办法吗?
一句话:没有。 My.Settings
本身不支持此功能。
你可以做的是制作你自己的 class 来包装 My.Settings
。只要你使用这个新的 class,并且不再直接去 My.Settings
,那么你可以在那个 class 上放置一个事件,它将满足你的需要。
然而,即使在这里,也无法强制 使用新的 class,并阻止直接访问 My.Settings
.
正如另一个答案的评论中所建议的,您可以通过 Binding
接收设置更改通知。或者,您基本上可以做 Binding
class 自己做的事情,因为它并没有那么多,例如
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim settingsPropertyDescriptors = TypeDescriptor.GetProperties(My.Settings)
Dim setting1PropertyDescriptor = settingsPropertyDescriptors(NameOf(My.Settings.Setting1))
setting1PropertyDescriptor.AddValueChanged(My.Settings, AddressOf Settings_Setting1Changed)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
My.Settings.Setting1 = "Hello World"
End Sub
Private Sub Settings_Setting1Changed(sender As Object, e As EventArgs)
Debug.WriteLine($"{NameOf(My.Settings.Setting1)} changed to ""{My.Settings.Setting1}""")
End Sub
此代码通过 PropertyDescriptor
将更改的处理程序添加到 属性,就像 Binding
class 所做的那样。