使用INotifyPropertyChanged可为Nullable的类型和属性

时间:2010-01-17 15:12:03

标签: c# vb.net nullable inotifypropertychanged

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

2 个答案:

答案 0 :(得分:4)

不需要所有复杂的逻辑。如果xy都是具有相同基础类型的nullables,则x等于y当且仅当

  1. x.HasValuetrue
  2. y.HasValuetrue
  3. x.Value等于y.Value
    1. x.HasValuefalse
    2. y.HasValuefalse
    3. 在这两种情况下,我们都不想提出属性更改通知,因此对非不等式的简单测试就足够了。因此:

      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