RaiseProperty
没有打电话。我想知道我在以下代码中遗漏了什么。当我调试时,我看到StartTime
被调用了。
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 :(得分:3)
所以StartDateTime基本上是一个计算属性。它可以这样定义:
public DateTime StartDateTime
{
get
{
return StartDate.Add(StartTime.TimeOfDay);
}
}
现在,当更新StartTime或更新StartDate时,您希望这些更改能够反映在UI中。要触发您需要拨打RaisePropertyChanged(() => StartDateTime);
private DateTime _startTime;
public DateTime StartTime
{
get { return _startTime; }
set
{
_startTime = value;
RaisePropertyChanged(() => StartDateTime);
}
}
现在,当更新StartTime时,UI将获得一个信号,即StartDateTime也会发生变化。
您的StartDate属性也需要调用RaisePropertyChanged(() => StartDateTime);
,因为StartDate或StartTime的更改会导致另一个StartDateTime值。
RaisePropertyChanged
是INotifyPropertyChanged
接口的实现,它定义了其他对象可以订阅的事件。实质上,这意味着订户将获得表示属性改变的事件,并且可能导致订户重新读取属性值,因此它可以例如相应地更新UI。
其他选择是:
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,而StartDateTime将自行调用RaisePropertyChanged
,因此UI也可以反映更改。