2016-06-07 1 views
0

RaiseProperty не звонит.Я удивляюсь, что мне не хватает в следующем коде. Когда я отлаживаю, я вижу, что вызвал StartTime.RaisePropertyChanged не звонит в mvvmcross

private DateTime _startTime; 
public DateTime StartTime 
{ 
    get { return _startTime; } 
    set 
    { 
     _startTime = value; 
     // I could able to see the following line gets called when I am in debug mode 
     RaisePropertyChanged(() => StartDateTime); 
    } 
} 

Следующая не дозвонились

private DateTime _startDateTime; 
public DateTime StartDateTime 
{ 
    get { return _startDateTime; } 
    set 
    { 
     _startDateTime = StartDate.Add(StartTime.TimeOfDay); 
    } 
} 
+0

Похоже, у вас нет какого-либо «RaisePropertyChanged» во втором звонке или я ошибаюсь? –

+0

Не уверен, правильно ли я понимаю, чего вы хотите. Вы ожидали, что RaisePropertyChanged (() => StartDateTime); на самом деле приводит к вызову setter свойства StartDateTime? Потому что это не то, что для RaisePropertyChanged. –

+0

Кевин и Питер, вы правы. Я хочу, чтобы вызывался «StartDateTime». – hotspring

ответ

3

Так StartDateTime в основном рассчитывается свойство. Она может быть определена следующим образом:

public DateTime StartDateTime 
{ 
    get 
    { 
     return StartDate.Add(StartTime.TimeOfDay); 
    } 
} 

теперь, когда время_запуск обновляется или StartDate обновляется, хочет, чтобы эти изменения будут отражены в пользовательском интерфейсе, например. Для того, чтобы вызвать, что вам нужен вызов RaisePropertyChanged(() => StartDateTime);

private DateTime _startTime; 
public DateTime StartTime 
{ 
    get { return _startTime; } 
    set 
    { 
     _startTime = value; 
     RaisePropertyChanged(() => StartDateTime); 
    } 
} 

Теперь, когда время_запуск обновляется, интерфейс получит сигнал, который StartDateTime изменяется, а также.

Свойство StartDate должно также вызвать RaisePropertyChanged(() => StartDateTime);, так как изменение в StartDate или StartTime приводит к другому значению StartDateTime.

RaisePropertyChanged - это реализация интерфейса INotifyPropertyChanged и определяет событие, на которое могут подписаться другие объекты. По сути, это означает, что абонент получит событие, сигнализирующее об изменении свойства, и, скорее всего, это приведет к тому, что абонент перечитает значение свойства, чтобы он мог, например, обновить интерфейс.

Другой вариант был бы это:

private DateTime _startTime; 
public DateTime StartTime 
{ 
    get { return _startTime; } 
    set 
    { 
     _startTime = value; 
     StartDateTime = StartDate.Add(_startTime.TimeOfDay) 
    } 
} 

private DateTime _startDate; 
public DateTime StartDate 
{ 
    get { return _startDate; } 
    set 
    { 
     _startDate = value; 
     StartDateTime = _startDate.Add(StartTime.TimeOfDay) 
    } 
} 

private DateTime _startDateTime; 
public DateTime StartDateTime 
{ 
    get { return _startDateTime; } 
    set 
    { 
     _startDateTime = value; 
     RaisePropertyChanged(() => StartDateTime); 
    } 
} 

Поскольку модификации либо StartDate или StartTime установит StartDateTime, который, в свою очередь, будет вызывать RaisePropertyChanged для себя так пользовательского интерфейса может отражать изменения, а также.

+0

Если вы хотите избежать царапин на голове, возможно, стоит добавить 'RaisePropertyChanged (() => StartTime)' и 'RaisePropertyChanged (() => StartDate)' вызывает слишком ... – Stuart

+0

Хорошая точка. Когда я реализую INotifyPropertyChanged, я лично всегда поднимаю событие для всех свойств. Я думаю, что наличие выборочного набора свойств почти наверняка даст головные боли позже. –

 Смежные вопросы

  • Нет связанных вопросов^_^