0

我正在尝试在我的代码中做一个“清除标志”。我在 UI 上连续显示数据,我希望用户能够在代码运行时使用“清除”按钮清除数据。我有第二个线程收集和更新 UI 线程上的数据。我试图在属性中使用一个标志,当它看到“清除标志”为真时,它会停留在预定值。当按下清除按钮时,我将“清除标志”设置为 true 并清除数据,但我的问题是知道何时完成,并在完成后将“清除标志”设置回 false。

private bool _clear;
public bool Clear
{
    get
    {
        return _clear;
    }
    set
    {
        _clear = value;
        OnPropertyChanged("Clear");

        if (value)
        {
            OnPropertyChanged(String.Empty);
        }
    }
}

private int _motorRPM;
public int MotorRPM
{
    get
    {
        return _motorRPM;
    }
    set
    {
        _motorRPM = value;
        OnPropertyChanged("MotorRPM");
    }
}


private int _aveRPM;
public int AveRPM
{
    get
    {
        return _aveRPM;
    }
    set
    {
        if (Clear)
        {
            _aveRPM = 0;
        }
        else
        {
            _aveRPM = (_aveRPM + value) / 2;
        }
        OnPropertyChanged("AveRPM");
    }
}


private int _minRPM = Int32.MaxValue;
public int MinRPM
{
    get
    {
        return _minRPM;
    }
    set
    {
        if (Clear)
        {
            _minRPM = Int32.MaxValue;
        }
        else
        {
            if (value < _minRPM)
            {
                _minRPM = value;
            }
        }
        OnPropertyChanged("MinRPM");
    }
}


private int _maxRPM;
public int MaxRPM
{
    get
    {
        return _maxRPM;
    }
    set
    {
        if (Clear)
        {
            _maxRPM = 0;
        }
        else
        {
            if (value > _maxRPM)
            {
                _maxRPM = value;
            }
         }
         OnPropertyChanged("MaxRPM");
    }
}

如您所见,我有一个“清除”属性,当设置为 true 时,将使用 OnPropertyChanged(String.Empty) 调用更新所有属性,当“清除”为 true 时,每个属性都设置为已知值。

完成所有 PropertyChanged 事件后,如何将 Clear 设置回 false?

4

1 回答 1

0

正如 Niclas 所说,我会说:不要这样做!ViewModel 中 PropertyChanged 的​​目的是更新 UI。如果您根据属性更改了某种逻辑,那么调试将是一场噩梦!

尽可能保持您的财产清洁。现在要更新一些依赖值,最好执行以下操作:

private bool _clear;
public bool Clear
{
    get
    {
        return _clear;
    }
    set
    {
        _clear = value;
        OnPropertyChanged("Clear");

        if (_clear)
          ClearValues();
    }
}

public void ClearValues()
{
   AveRPM=0;
   MinRPM=0;
   MaxRPM=0;
   ...
   Clear=False;
}

不完美,但对我来说似乎更具可读性和可维护性。

希望能帮助到你。

于 2013-04-30T06:18:08.813 回答