vb.net:在PropertyChange上不更新UserControl-CheckBox和Class-Property的DataBinding

时间:2013-04-19 14:00:17

标签: vb.net winforms data-binding user-controls

我在其中创建了一个带有复选框的小型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

2 个答案:

答案 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