Обнуляемые типы и свойства с INotifyPropertyChanged - PullRequest
0 голосов
/ 17 января 2010

Кажется излишним устанавливать значение обнуляемого типа и реализовывать 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 ]

4 голосов
/ 17 января 2010

Нет необходимости во всей сложной логике. Если x и y оба обнуляются с одним и тем же базовым типом, тогда 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.

1 голос
/ 18 января 2010

В сторону ... Я заметил, что вы используете LONG для хранения рабочего номера телефона. Даже без знака это не сработает над ареакодом 429 в США. Вы можете рассмотреть DOUBLE или STRING

...