RaisePropertyChanged不会调用mvvmcross

时间:2016-06-07 18:51:18

标签: c# mvvmcross

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);
    }
}

1 个答案:

答案 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值。

RaisePropertyChangedINotifyPropertyChanged接口的实现,它定义了其他对象可以订阅的事件。实质上,这意味着订户将获得表示属性改变的事件,并且可能导致订户重新读取属性值,因此它可以例如相应地更新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也可以反映更改。