数据绑定文本框不与源
更新我有一个实现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
我已经阅读了这些答案Here和Here,并试图寻找想法,但我没有想法。
编辑:看来,如果我用反序列化XML填充类,然后设置绑定它的工作,但不是当绑定设置第一。我会认为它会以任何方式工作。
-
你应该到
提供的属性名称PropertyChangedEventArgs
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Nameof(Wages))
您没有显示,但显然当您“加载”文件并反序列化类时,您将创建
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)
U的错误代码
PropertyChangedEventArgs需要字符串(财产名称)
所以 “工资”
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Wages"))
我注意到自己了。即使传递属性名称而不是属性值,它也不会更新,除非我在填充类之后设置了绑定。 –
所以使用Property Set for Map对象和当你填充新对象时你可以很容易地重新绑定窗体控件 –
'MyMap'在'New'子节点之前声明。 Deserialize的代码是:'MyMap = BM.Utilities.FileHelper.Deserialize(Of Map)(“Routes.xml”)'当然这就是同一个实例吗? –
反序列化将创建类型为“Map”的新实例。 – Fabio