2017-10-10 78 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对象和当你填充新对象时你可以很容易地重新绑定窗体控件 –