【问题标题】:Update multiple properties on set of a single property在单个属性的集合上更新多个属性
【发布时间】:2016-10-17 12:11:49
【问题描述】:

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

【问题讨论】:

    标签: c# mvvm xamarin.forms prism


    【解决方案1】:

    你可以这样做:

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

    【讨论】:

    • 这很有趣,因为我尝试过类似的东西,但当我测试它时它不起作用。但是现在当我从头再来时,我一定是第一次做错了什么。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 为什么不能直接在 ViewModel 中设置私有属性?
    • 不是属性,只是支持属性的字段,因此您不会忘记调用 PropertyChanged 或设置器中的任何内容。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多