【问题标题】:Invisible Data Binding不可见的数据绑定
【发布时间】:2020-03-04 04:05:56
【问题描述】:

我试图跟上一个状态机,我在面板中有多个控件。我所做的是在绑定到 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# 解决方案非常满意,因为它们基本上是同一种语言,但语法风格不同。

【问题讨论】:

    标签: .net vb.net


    【解决方案1】:

    您需要处理Binding 对象的FormatParse 事件并反转值。我刚刚在表单中添加了两个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 时,只有Buton1TextBox1 可见,而当我取消选中它时,只有Button2TextBox2 可见。

    这里有一些更短但功能相同的代码:

    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
    

    【讨论】:

      猜你喜欢
      • 2011-05-28
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      相关资源
      最近更新 更多