0

我制作了一个带有复选框的小型 UserControl,并尝试将其 DataBind 到类的布尔属性。Binding的DataSourceUpdateMode设置为OnPropertyChanged。不幸的是,它没有按预期工作。

如果我更改我的类属性,复选框会立即做出反应,但不会反过来。单击复选框不会立即更改类属性。只有当您离开用户控件(pe 进入另一个控件)时,类属性才会更新。我猜是因为复选框只有在离开后才会被验证。但为什么?

任何想法都非常感谢!

问候

基督教

这是一些简单的代码(不是 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

用户控件:

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
4

2 回答 2

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 而根本不使用 a UserControl

编辑:

很抱歉,我以为我在 WPF 上设置了问题过滤器,但没有看到这是一个 WinForms 问题;-) 不幸的是,我对 WinForm 绑定的特性一无所知,所以我帮不了你。如果您有这么大的 WinForms 项目,显然您不应该更改为 WPF。对于我作为一个非 WinForm-Guy 的我来说,所描述的行为是有道理的。如果你做了一个UserControl你把处理事情的责任交给这个控件。当您离开此控件时,下一层知道要更新。另一个方向是事件驱动,因此它会对变化做出反应。

但正如我所说,我不知道 WinForms。

于 2013-04-19T15:59:59.167 回答
0

解决方案很简单:

使用 OnPropertyChanged 的​​ DataBinding 仅在属性及其事件共享相同名称时才有效!

-> 将用户控件事件重命名为 OnOffChanged,一切正常!

问候 cl10k

于 2013-07-01T21:14:10.597 回答