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

本文关键字:属性 更新 集合 单个 | 更新日期: 2023-09-27 18:13:19

在通知视图有关更改之前,我无法弄清楚如何更新多个属性。我得到了一个ViewModel的开始作为日期时间,开始时间作为时间跨度,结束作为日期时间和结束时间作为时间跨度。当我设置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); 
}

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

你可以这样做:

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表示为StartTime + duration,并且在StartTime setter中只需为两个属性调用PropertyChanged。此外,你不应该直接设置虚拟机属性中使用的私有字段。

如果你只是设置了EndTime的属性而不是后台字段,它会为你调用INPC(假设你有一个正确定义的EndTime属性)

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