簡體   English   中英

具有INotifyPropertyChanged的可空類型和屬性

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

不需要所有復雜的邏輯。 如果xy都是具有相同基礎類型的可空值,則x僅當且僅當x等於y

  1. x.HasValuetrue
  2. y.HasValuetrue
  3. x.Value等於y.Value

要么

  1. x.HasValuefalse
  2. y.HasValuefalse

在這兩種情況下,我們都不希望引發屬性更改通知,因此對不平等的簡單測試就足夠了。 從而:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM