设置可空类型的值并实现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
答案 0 :(得分:4)
不需要所有复杂的逻辑。如果x
和y
都是具有相同基础类型的nullables,则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
。
答案 1 :(得分:1)
暂且不说......我注意到你正在使用LONG存储工作电话号码。即使是未签名的,这也会在美国的areacode 429上失败。您可能会考虑DOUBLE或STRING