有一个数据类:
Public Class MyData
Implements ComponentModel.INotifyPropertyChanged
Private _myint As Int32
Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Public Property MyInt As Int32
Get
Return _myint
End Get
Set(ByVal value As Int32)
_myint = Math.Max(Math.Min(value, 25), 0) '将数据限制在0~25的范围内
RaiseEvent PropertyChanged(Me, New ComponentModel.PropertyChangedEventArgs("MyInt"))
End Set
End Property
End Class
我将它绑定到一个 TextBox 上:
Dim x As New MyData
MyTextBox.SetBinding(TextBox.TextProperty, New Binding("MyInt") With {.Mode = BindingMode.TwoWay, .Source = x, .UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged})
我需要达到的效果是,当 MyTextBox 的显示值达到25后往里面输入数字,能自动恢复到25。然而实际情况却是:若显示值小于25,输入数字后大于25,显示值自动恢复到25;若显示值等于25,输入数字后就不受数据类里面的逻辑控制,具体流程如下:(初始值0,输入光标放在输入框最后面)
按1:闪一下01,恢复到1
按1:11
按1:闪一下111,恢复到25
按1:251
按1:2511
……
令我惊讶的是,在后面显示值超过25的情况下,MessageBox.Show(MyTextBox.Text) 仍然是25,就是说 Text 属性值和显示值不一致
请大家帮忙,如何才能让我设置的逻辑发挥作用?
你的逻辑就是保证textbox的值不超过25呀,当然不会出现>25的值的情况。
请你搞清楚,event.value就是整个textbox的值,可不是你随手输入的数字。跟显示不显示没关系。
你输入的值,在程序里认为的就是整个textbox返回给后台的值就叫输入。不是你偷懒前面的保留后面输入的叫输入。