将事件处理程序添加到 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 所做的那样。