[英]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.