繁体   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