2017-10-10 80 views
0

更新我有一個實現INotifyPropertyChanged的如下的自定義類(外來和重複特性移除):數據綁定文本框不與源

Public Class Map 
     Implements INotifyPropertyChanged 

     Private _wages As Decimal 
     Property Wages As Decimal 
      Get 
       Return _wages 
      End Get 
      Set(value As Decimal) 
       Debug.Print("Event Raised: " & _wages & " " & value) 
       _wages = value 
       RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Wages)) 
      End Set 
     End Property 

Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 

類被正確地被序列化/反序列化。當我加載XML文件時,顯示工資的TextBox沒有更新以反映工資值。

我有設定(DevExpress的)文本框數據綁定:

txtWages.DataBindings.Add(New Binding("EditValue", mymap, "Wages", False, DataSourceUpdateMode.OnPropertyChanged)) 

當我打開我可以看到從Debug.Print新舊價值的文件:

時引發的事件:0 13

然而,txtWages撐作爲0

我已經閱讀了這些答案HereHere,並試圖尋找想法,但我沒有想法。

編輯:看來,如果我用反序列化XML填充類,然後設置綁定它的工作,但不是當綁定設置第一。我會認爲它會以任何方式工作。

回答

1
  1. 你應該到PropertyChangedEventArgs

    提供的屬性名稱
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Nameof(Wages)) 
    
  2. 您沒有顯示,但顯然當您「加載」文件並反序列化類時,您將創建Map的新實例並將其設置爲mymap。控件的綁定仍然會引用原始實例並聆聽它的事件。

創建Map類型的財產「包裝」視圖模型,當你加載文件提高屬性更改事件。

Public Class ViewModel 
    Private _Map As Map 
    Property Map As Map 
     Get 
      Return _Map 
     End Get 
     Set(value As Map) 
      _Map = value 
      RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Nameof(Wages)) 
     End Set 
    End Property 
End Class 

然後在表單也結合

Dim viewmodel = new ViewModel() 
viewmodel.Map = DeserializeMap() ' Your deserialize logic 
txtWages.DataBindings.Add("EditValue", 
          viewmodel, 
          "Map.Wages", 
          False, 
          DataSourceUpdateMode.OnPropertyChanged) 
+0

'MyMap'在'New'子節點之前聲明。 Deserialize的代碼是:'MyMap = BM.Utilities.FileHelper.Deserialize(Of Map)(「Routes.xml」)'當然這就是同一個實例嗎? –

+1

反序列化將創建類型爲「Map」的新實例。 – Fabio

2

U的錯誤代碼

PropertyChangedEventArgs需要字符串(財產名稱)

所以 「工資」

RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Wages")) 
+0

我注意到自己了。即使傳遞屬性名稱而不是屬性值,它也不會更新,除非我在填充類之後設置了綁定。 –

+0

所以使用Property Set for Map對象和當你填充新對象時你可以很容易地重新綁定窗體控件 –