2009-02-05 27 views
1

在数据绑定和绑定力控制防止财产的变化,以显示当前值

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代码中处理这个问题,但那不是我的目标。

+0

如果你在`IfMe.IsNew`块中调用`OnPropertyChanged(“UID”)`会发生什么? – outis 2009-12-01 05:10:32

回答

0

我找到了答案。

首先这是一个问题,并已注意到洛基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