[英]Nullable Types and properties with INotifyPropertyChanged
设置可为null的类型的值并实现iNotifyPropertyChanged似乎有点过头。 有更好的方法吗?
Private _WorkPhone As Long?
Public Property [WorkPhone]() As Long?
Get
Return _WorkPhone
End Get
Set(ByVal value As Long?)
If value.HasValue = False Then
If _WorkPhone.HasValue = True Then
MyBase.RaisePropertyChanging("WorkPhone")
_WorkPhone = Nothing
MyBase.MarkDirty()
MyBase.RaisePropertyChanged("WorkPhone")
End If
Else
If _WorkPhone.HasValue Then
If _WorkPhone.Value <> value.Value Then
MyBase.RaisePropertyChanging("WorkPhone")
_WorkPhone = value
MyBase.MarkDirty()
MyBase.RaisePropertyChanged("WorkPhone")
End If
Else
MyBase.RaisePropertyChanging("WorkPhone")
_WorkPhone = value
MyBase.MarkDirty()
End If
MyBase.RaisePropertyChanged("WorkPhone")
End If
End Set
End Property
我尝试使用简单的代码,但是MyBase.RaisePropertyChanging(“ WorkPhone”)上的断点从未命中,并且值从未更改。
If _WorkPhone <> value Then
MyBase.RaisePropertyChanging("WorkPhone")
_WorkPhone = value
MyBase.MarkDirty()
MyBase.RaisePropertyChanged("WorkPhone")
End If
不需要所有复杂的逻辑。 如果x
和y
都是具有相同基础类型的可空值,则x
仅当且仅当x
等于y
x.HasValue
为true
y.HasValue
为true
x.Value
等于y.Value
要么
x.HasValue
为false
y.HasValue
为false
在这两种情况下,我们都不希望引发属性更改通知,因此对不平等的简单测试就足够了。 从而:
Private _WorkPhone As Long?
Public Property [WorkPhone]() As Long?
Get
Return _WorkPhone
End Get
Set(ByVal value As Long?)
If Not _workPhone.Equals(value)
MyBase.RaisePropertyChanging("WorkPhone")
_WorkPhone = value
MyBase.MarkDirty()
MyBase.RaisePropertyChanged("WorkPhone")
EndIf
End Set
End Property
请注意,我们定义使用Not Nullable(Of T).Equals
代替<>
因为后者的计算结果为Nothing
,如果一个,如果它的操作数是Nothing
。
顺便说一句...我注意到您正在使用LONG来存储工作电话号码。 即使未签名,这也将在美国的区号429以上失败。您可以考虑DOUBLE或STRING
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.