2010-01-17 77 views
0

这似乎有点小题大做设置可空类型的值和执行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(“办公电话”)断点从不打,和值不会改变。

If _WorkPhone <> value Then 
    MyBase.RaisePropertyChanging("WorkPhone") 
    _WorkPhone = value 
    MyBase.MarkDirty() 
    MyBase.RaisePropertyChanged("WorkPhone") 
End If 

回答

4

不需要所有复杂的逻辑。如果xy具有相同基础类型两者nullables然后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

+0

这正是我所用的代码,但在从asp.net回发,它没有得到到第一mybase.raisepropertychanging电话。这不是设定价值,因此是复杂的逻辑。 – 2010-01-17 15:55:43

+0

@Rick Ratayczak:什么是_workPhone'的'在这种情况下,价值观和'value'?除非我们都忽视了一些微妙的东西,否则上述内容应该是正确的。 – jason 2010-01-17 16:03:25

+0

_workphone.hasvalue = false,并且value.hasvalue =真 我传递一个电话号码,一个属性没有。 – 2010-01-17 16:04:45

1

顺便说一句...我注意到你正在使用长来存储工作电话号码。即使是无符号,这将在美国失败上述AREACODE 429你可能会考虑DOUBLE或STRING

+0

谢谢,我欣赏反馈。这是来自实体框架,所以我会更改数据库。 – 2010-01-18 12:35:45