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

时间:2016-10-17 12:11:49

标签: c# mvvm xamarin.forms prism

在我通知视图有关更改之前,我无法弄清楚如何更新多个属性。 我得到了一个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); 
}

3 个答案:

答案 0 :(得分:2)

您可以这样做:

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事件总是一个接一个地触发,但是当一个事件被触发时,数据总是一致的。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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