.net - 不可见的数据绑定
问题描述
我试图跟上一个状态机,我在面板中有几个控件。我所做的是在绑定到 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# 解决方案非常满意,因为它们基本上是相同的语言,具有不同的语法风格。
解决方案
您需要处理对象的Format
和Parse
事件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
,只有Buton1
andTextBox1
是可见的,当我取消选中它时,只有Button2
andTextBox2
是可见的。
这是一些较短但功能等效的代码:
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
推荐阅读
- c++ - C++ :: 在按下回车键之前返回用户输入的函数
- c# - 我将如何在此 AI 以下代码中实现 navmesh 寻路。C# 统一
- java - 使用嵌套的for循环绘制等边三角形?
- javascript - 嵌套文本的样式不起作用
- java - Spring Boot + JMustache 404 not found error for .html page from /resources/templates 文件夹
- php - 如何使用 sum() 在 mysqli 中添加行
- python - 合并多个大型 DataFrame 的有效方法
- apache-kafka - 使用 SCS 删除消费消息的 kafka 日志
- chart-director - 如何去除 CharDirector ContourLayer 中生成的黑色边框?
- laravel - Laravel 5.5 条件