【问题标题】:Databound TextBox not updating with Source数据绑定文本框不随源更新
【发布时间】:2017-10-10 12:29:40
【问题描述】:

我有一个实现 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)TextBox DataBindings 设置为:

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

当我加载文件时,我可以从 Debug.Print 中看到旧值和新值:

已引发事件:0 13

但是,txtWages 保持为 0

我已阅读这些答案HereHere 并试图寻找想法,但我没有想法。

编辑: 似乎如果我用反序列化 XML 填充类然后设置绑定它可以工作,但不是在首先设置绑定时。我原以为它会以任何一种方式工作。

【问题讨论】:

    标签: vb.net data-binding


    【解决方案1】:

    你的代码有错误

    PropertyChangedEventArgs 需要字符串(属性名称)

    所以“工资”

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

    【讨论】:

    • 我自己也注意到了。即使传递属性名称而不是属性值,它也不会更新,除非我在填充类后设置绑定。
    • 所以使用 Map 对象的属性集,当您填充新对象时,您可以轻松重新绑定表单控件
    【解决方案2】:
    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)
    

    【讨论】:

    • MyMapNew 子之前声明。反序列化的代码是:MyMap = BM.Utilities.FileHelper.Deserialize(Of Map)("Routes.xml") 那肯定是同一个实例吗?
    • 反序列化将创建Map类型的新实例。
    猜你喜欢
    • 2011-03-05
    • 2010-12-10
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    相关资源
    最近更新 更多