首页 > 解决方案 > 不可见的数据绑定

问题描述

我试图跟上一个状态机,我在面板中有几个控件。我所做的是在绑定到 CheckBox 的表单上设置一个布尔属性。为我希望在属性为 True 时可见的控件设置数据绑定很简单:

Public Property IsCalibration As Boolean = True

Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles Me.Load
    CheckBoxIsCalibration.DataBindings.Add(New Binding("Checked", Me, "IsCalibration", False, DataSourceUpdateMode.OnPropertyChanged, False))
    ButtonStartCalibration.DataBindings.Add(New Binding("Visible", Me, "IsCalibration", False, DataSourceUpdateMode.OnPropertyChanged, False))
    ButtonSave.DataBindings.Add(New Binding("Visible", Me, "IsCalibration", False, DataSourceUpdateMode.OnPropertyChanged, False))
    LabelProductionNumber.DataBindings.Add(New Binding("Visible", Me, "IsCalibration", False, DataSourceUpdateMode.OnPropertyChanged, False))
    TextBoxProductionNumber.DataBindings.Add(New Binding("Visible", Me, "IsCalibration", False, DataSourceUpdateMode.OnPropertyChanged, False))
    LabelEngageNumber.DataBindings.Add(New Binding("Visible", Me, "IsCalibration", False, DataSourceUpdateMode.OnPropertyChanged, False))
    TextBoxEngageNumber.DataBindings.Add(New Binding("Visible", Me, "IsCalibration", False, DataSourceUpdateMode.OnPropertyChanged, False))
    TextBoxEngageNumber.DataBindings.Add(New Binding("Visible", Me, "IsCalibration", False, DataSourceUpdateMode.OnPropertyChanged, False))
End Sub

但是,当 IsCalibration 为 False 时,如何为要隐藏的控件设置数据绑定?类似于“不可见”数据绑定的东西。

我知道另一种方法是设置一个可覆盖的子组件,当 IsCalibration 属性更改时调用该子组件,该子组件会调用一个事件,该事件可以将名为IsNotCalibration的单独属性的值设置为与IsCalibration的值相反的值,以便我可以绑定该 IsNotCalibration 属性的其他控件。但我不喜欢这个解决方案,这似乎是一种不必要的措施,只是为了设置有效的“隐形”效果。

另外作为旁注,当我使用 VB.NET 时,我对 C# 解决方案非常满意,因为它们基本上是相同的语言,具有不同的语法风格。

标签: .netvb.net

解决方案


您需要处理对象的FormatParse事件Binding并反转值。我刚刚在表单中添加了两个Buttons、两个TextBoxes和一个CheckBox,然后这样做了:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim normalBinding1 = Button1.DataBindings.Add("Visible", CheckBox1, "Checked")
    Dim normalBinding2 = TextBox1.DataBindings.Add("Visible", CheckBox1, "Checked")

    Dim inverseBinding1 = Button2.DataBindings.Add("Visible", CheckBox1, "Checked")
    Dim inverseBinding2 = TextBox2.DataBindings.Add("Visible", CheckBox1, "Checked")

    With inverseBinding1
        AddHandler .Format, AddressOf InvertBinding
        AddHandler .Parse, AddressOf InvertBinding
    End With

    With inverseBinding2
        AddHandler .Format, AddressOf InvertBinding
        AddHandler .Parse, AddressOf InvertBinding
    End With
End Sub

Private Sub InvertBinding(sender As Object, e As ConvertEventArgs)
    e.Value = Not CBool(e.Value)
End Sub

当我选中 时CheckBox,只有Buton1andTextBox1是可见的,当我取消选中它时,只有Button2andTextBox2是可见的。

这是一些较短但功能等效的代码:

Private WithEvents inverseBinding1 As Binding
Private WithEvents inverseBinding2 As Binding

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Button1.DataBindings.Add("Visible", CheckBox1, "Checked")
    TextBox1.DataBindings.Add("Visible", CheckBox1, "Checked")

    inverseBinding1 = Button2.DataBindings.Add("Visible", CheckBox1, "Checked")
    inverseBinding2 = TextBox2.DataBindings.Add("Visible", CheckBox1, "Checked")
End Sub

Private Sub InvertBinding(sender As Object, e As ConvertEventArgs) Handles inverseBinding1.Format,
                                                                           inverseBinding1.Parse,
                                                                           inverseBinding2.Format,
                                                                           inverseBinding2.Parse
    e.Value = Not CBool(e.Value)
End Sub

推荐阅读