2009-02-05 31 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