我在其中创建了一个带有复选框的小型UserControl,并尝试将其绑定到类的布尔属性。 Binding的 DataSourceUpdateMode 设置为 OnPropertyChanged 。不幸的是,它不能按预期工作。
如果我改变了我的classproperty,那么复选框会立即做出反应但不是相反。点击复选框不会立即更改类属性。只有在离开usercontrol(p.e。进入另一个控件)时才会更新classproperty。我猜它是因为复选框只在离开后才得到验证。但为什么呢?
非常感谢任何想法!
此致
基督教
这是一些简单的代码(不是c& p,调试器不会在实际代码上给出任何错误):
课程:
Imports System.ComponentModel
Public Class _testClass
Implements INotifyPropertyChanged
Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Private Sub NotifyPropertyChanged(ByVal info As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
End Sub
Private _Status As Boolean
Public Property Status() As Boolean
Get
Return _Status
End Get
Set(ByVal value As Boolean)
_Status = value
NotifyPropertyChanged("Status")
Debug.WriteLine("CLASS " & value)
End Set
End Property
End Class
UserControl:
Imports System.ComponentModel
Public Class _testcontrol
Public Event Valuechanged As EventHandler
Public Property OnOff() As Boolean
Get
Return CheckBox1.Checked
End Get
Set(ByVal value As Boolean)
CheckBox1.Checked = value
Debug.WriteLine("PROPERTY " & value)
End Set
End Property
Private Sub CheckBox1_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
RaiseEvent Valuechanged(sender, e)
Debug.WriteLine("EVENT")
OnOff = CheckBox1.Checked
End Sub
End Class
数据绑定:
Public Class Form1
Dim testclass As New _testClass
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Testcontrol.DataBindings.Add(New Binding("OnOff", Me.testclass, "Status", True, DataSourceUpdateMode.OnPropertyChanged))
End Sub
End Class
答案 0 :(得分:0)
尝试在XAML中进行绑定,使用wpf更容易,更好。使用CheckBox1.CheckedChanged
事件也不是数据绑定。您可以手动数据绑定或连接事件,但数据绑定更好。
此处为DependencyProperty
:
Public Shared ReadOnly OnOffProperty As DependencyProperty = DependencyProperty.Register("OnOff", GetType(Boolean), GetType(_testcontrol), New PropertyMetadata("", New PropertyChangedCallback(AddressOf On_OnOffChanged)))
Private Shared Sub On_OnOffChanged)(d As DependencyObject, e As DependencyPropertyChangedEventArgs)
'Do what you want to do with the new value eg: set OnOff
End Sub
但在你的情况下,我可能会尝试直接在wpf中绑定到Checkbox,而根本不使用UserControl
。
编辑:
对不起,我以为我在WPF上设置了问题过滤器,并没有看到这是一个WinForms问题;-)不可思议的是,我对WinForm Bindings的特性一无所知,所以我无法帮助您。显然,如果你有一个如此大的WinForms项目,你不应该改为WPF。对于我来说,作为一个非WinForm-Guy,所描述的行为是有道理的。如果您创建UserControl
,则您有责任处理此控件的操作。当您离开此控件时,下一层知道要更新。另一个方向是事件驱动,因此它会对变化作出反应。
但正如我所说,我不知道WinForms。
答案 1 :(得分:0)
解决方案很简单:
使用OnPropertyChanged的DataBinding只有在Property及其Event共享相同名称时才有效!
- >将usercontrol事件重命名为OnOffChanged,一切正常!
关心cl10k