【问题标题】:Prevent property change in databinding and force bound control to show current value防止数据绑定中的属性更改并强制绑定控件显示当前值
【发布时间】:2010-10-05 19:34:44
【问题描述】:

我有

    Public Overrides Property UID() As String
        Get
            Return mUID
        End Get
        Set(ByVal value As String)
            If Me.IsNew Then
                mUID = value
            End If
            OnPropertyChanged("UID")
        End Set
    End Property

该类实现了 INotifyPropertyChanged,并且我正在绑定到 WinForm 控件中的 TextBox 控件。

问题是当用户在文本框中键入一个值时,即使绑定的值保持不变,新值也会显示在文本框中,这与 IsNew 为 false 的事实相同。 (我尝试过使用这两种类型的 DataSourceUpdateMode。)

我已阅读INotifyPropertyChanged problem 并且我相信 Windows 窗体的工作方式基本相同,因为事件的发起者也不会检测到对事件的处理。

我可以在 BO 类中做些什么来强制控件响应 INotifyPropertyChanged 事件吗?或者我可以在 BO 类中做些什么来让控件显示正确的值?

我意识到我可以通过各种方式在 GUI 代码中处理这个问题,但这不是我的目标。

【问题讨论】:

  • 如果你把对OnPropertyChanged("UID")的调用放在If Me.IsNew块内会发生什么?

标签: winforms data-binding inotifypropertychanged


【解决方案1】:

我找到了答案。

首先这是一个问题,Rocky Lhotka 已经注意到了这一点。我使用的解决方案来自他。

首先他有一个控件,你可以放在表单或用户控件上,它解决了问题。

他还有一些我稍微修改和使用的代码,并将其放在我们的基本表单和用户控件中。

Private Sub baseUserControl_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    HookBindings(Me)
End Sub

Private Sub HookBindings(ByVal CNTRL As Control)
    For Each ctl As Control In CNTRL.Controls
        If Not TypeOf ctl Is baseUserControl Then
            For Each b As Binding In ctl.DataBindings
                AddHandler b.BindingComplete, AddressOf ReadBinding
            Next
            HookBindings(ctl)
        End If
    Next
End Sub

Private Sub ReadBinding(ByVal sender As Object, ByVal e As BindingCompleteEventArgs)
    e.Binding.ReadValue()
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2020-07-09
    • 1970-01-01
    相关资源
    最近更新 更多