将文本框数据绑定到结构

Databinding textbox to a structure

我正在使用一个结构并将其序列化到 SQL 服务器。我正在尝试将一些屏蔽和普通文本框数据绑定到这个结构,所以当我将数据读回我的结构时,它会自动填充我绑定的文本框,但它不起作用......我认为我的绑定可能是不正确的语法?有人可以帮忙吗?谢谢!

<Serializable()>
Private Enum PhoneTypes
    <Description("New phoneline")> [NewLine] = 1
    <Description("Existing phoneline")> [ExistingLine] = 2
    <Description("Voicemail only")> [VoicemailOnly] = 3
End Enum

'this is for the phones tab to serialize it and store it in the database 
<Serializable()>
Private Structure Phones
    Public Property PhoneNeeds As PhoneTypes
    Public Property PhoneNumber As String
    Public Property Extension As String
    Public Property Notes As String
End Structure

Private PhoneTab As new Phones

Private Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    InitPhones()
    DoStuff()
End Sub

Private Sub InitPhones()
    txtPhoneNotes.DataBindings.Add("Text", PhoneTab, "Notes")
    txtPhoneNumber.DataBindings.Add("Text", PhoneTab, "PhoneNumber")
    txtExtension.DataBindings.Add("Text", PhoneTab, "Extension")
End Sub

Private Sub DoStuff()
    PhoneTab = mod_Global.Deserialize(Of Phones)(.Item("User_Needed_Phones"))
    MsgBox(PhoneTab.Notes) '<--- this works and I can see the values contained in my structure but does not auto populate the textbox from the binding 
End If 

TL; DR; 这个案例很有趣,但是修复非常简单,如果您正在寻找修复,请跳转到 post 的末尾到 Fix 部分。


如果您有兴趣更多地关注细节,请继续阅读此处。考虑以下事实:

  • 支持数据绑定到结构 half-way。这意味着,在数据绑定之后,您可以在控件 属性 中看到结构的 属性 值。但稍后,如果您修改控件 属性 的值,所做的更改将不会反映到您的结构中。此外,如果您修改结构 属性 值,更改将不会反映到控件 属性.
    那是因为当你设置数据绑定到一个结构时,你的结构的值将被复制到 Binding class,稍后当你更新你的控件或 COPY 的值时将被更新,或者如果您将新值分配给原始结构的 属性,则 COPY 将看不到更改。
    此外,即使您使用 class,当您修改对象的 属性 值时,更改也会立即反映在控件中,前提是您的 class 正确实现了 INotifyPropertyChanged。

  • 即使您使用 class,假设您在变量 v 中有一个对象,并且您为该对象设置了数据绑定,稍后如果您分配一个新实例变量v,与数据绑定无关。变量 v 现在指向对象的新实例,数据绑定继续使用对象的前一个实例。

我相信阅读更多关于 值类型和引用类型的内容 将帮助您更好地了解当前情况。

这是您的代码的简化版本:

1: dim x = New MyStructure()
2: textBox1.DataBindings.Add("Text", x , "MyProperty")
3: Dim x =  LoadAnotherMyStructure()

在第二行中,您将数据绑定设置为 MyStructure 的一个实例;它基本上将 x 的值复制到 Binding class 的构造函数中,然后它不知道 x 之后会发生什么;它无法监视它。

它只能加载第 1 行中 x 的 MyProperty 的值并将其显示在 textBox1.Text 中,但稍后,如果您将新结构分配给 x 或修改 x.MyProperty 的值,则 textBox1.Text 将不会更新。

此外,如果您更改 textBox1.Text 的值,则更改不会反映到结构中。


修复

这里的修复非常简单:

1: Dim x =  LoadAnotherMyStructure()
2: textBox1.DataBindings.Add("Text", x , "MyProperty")

但请记住,它仍将是 half-way。您可以看到控件中的值,但是如果您修改控件中的值,它们将不会被写回到结构中。