2010-01-17 2 views
0

Кажется, что overkill задает значение типа NULL и реализует iNotifyPropertyChanged. Есть ли лучший способ сделать это?Nullable Типы и свойства с 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

Нет необходимости в сложной логике. Если x и y оба nullables с одной и той же базового типа, то x равно y тогда и только тогда, когда

  1. x.HasValue является true
  2. y.HasValue является true
  3. x.Value равна y.Value

или

  1. x.HasValue является false
  2. y.HasValue является false

Ни в одном из этих случаев мы хотели бы поднять свойство изменилось уведомление и, таким образом, простой тест для не-равенства будет достаточно. Таким образом:

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

Это именно тот код, который я использовал, но в postback от asp.net он не попадал в первый вызов mybase.raisepropertychanging. Он не устанавливал значение, следовательно, сложную логику. –

+0

@Rick Ratayczak: Каковы были значения '_workPhone' и' value' в этом случае? Если мы оба не увидим что-то тонкое, то это должно быть правильно. – jason

+0

_workphone.hasvalue = false, и value.hasvalue = true Я прохожу по номеру телефона, в собственность без. –

1

Как в стороне ... Я замечаю, что вы используете LONG для хранения рабочего номера телефона. Даже без знака это приведет к сбою выше areacode 429 в U.S. Вы можете рассмотреть DOUBLE или STRING

+0

Спасибо, я ценю обратную связь. Это происходит из Entity Framework, поэтому я буду менять БД. –