0

设置可空类型的值并实现 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
4

2 回答 2

4

不需要所有复杂的逻辑。如果xy都是具有相同基础类型的可空值,则xy且仅当

  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而不是,<>因为后者的计算结果为Nothingif one 如果其操作数是Nothing

于 2010-01-17T15:49:19.817 回答
1

顺便说一句...我注意到您正在使用 LONG 来存储工作电话号码。即使未签名,这也会在美国的区号 429 以上失败您可能会考虑 DOUBLE 或 STRING

于 2010-01-17T21:07:01.193 回答