更新单个 属性 集合的多个属性

Update multiple properties on set of a single property

在将更改通知视图之前,我不知道如何更新多个属性。 我得到了一个 ViewModel,其 Start 为 DateTime,StartTime 为 TimeSpan,End 为 DateTime,EndTime 为 TimeSpan。 当我设置 StartTime 时,我想相应地更新 End 和 EndTime。 因此,如果我将 StartTime 设置为晚于 EndTime 的时间,我希望将 EndTime 更新为 StartTime + 30 分钟。我曾经使用 WPF,在那里我能够更新 ViewModel 中的所有私有属性,然后调用 PropertyChange 事件,但是对于这个 Prism,我不知道如何做到这一点。看来我只能使用 SetProperty 方法调用 PropertyChanged 事件。我做了一个我认为我需要做的小例子..

DateTime? _start = DateTime.Now;
TimeSpan? _startTime = DateTime.Now.TimeOfDay;
DateTime? _end = DateTime.Now;
TimeSpan? _endTime = DateTime.Now.TimeOfDay;
public TimeSpan? StartTime
{
    var val = value;
    _end = new TimeSpan(val.Hours, val.Minutes + 30, 0);
    SetPropertyChanged(ref _startTime, val); 
}

最好将 EndTime 表示为 StartTime + 持续时间,并且在 StartTime setter 中只需为两个属性调用 PropertyChanged。 此外,您不应该直接设置 VM 属性中使用的私有字段。

你可以这样做:

private int _myFieldA;
private int _myFieldB;

public int MyPropertyA
{
    get { return _myFieldA; }
    set
    {
        _myFieldA = value;
        _myFieldB = value + 10;
        OnPropertyChanged( () => MyPropertyA );
        OnPropertyChanged( () => MyPropertyB );
    }
}

public int MyPropertyB
{
    get { return _myFieldB; }
    set
    {
        _myFieldA = value - 10;
        _myFieldB = value;
        OnPropertyChanged( () => MyPropertyA );
        OnPropertyChanged( () => MyPropertyB );
    }
}

那些 PropertyChanged 事件总是一个接一个地触发,但是数据总是一致的,当一个被触发时。

如果您只是设置 EndTime 的 属性 而不是支持字段,它会为您调用 INPC(假设您有正确定义的 EndTime 属性)。

public TimeSpan? StartTime
{
    SetProperty(ref _startTime, val);
    EndTime = StartTime + duration;
}