Как обновить вычисленные значения в подклассах - PullRequest
1 голос
/ 29 мая 2019

Как видно из заголовка, я хочу обновить вычисленные значения в подклассе.У меня есть коллекция Parameters FPBViewModel как ItemSrid ItemGrid на моей странице WPF.HeatingAirflow - это просто сумма MinAirflow и FanAirflow.Каков наилучший способ автоматического обновления значения параметра HeatingAirflow при изменении значения параметра MinAirflow или FanAirflow в DataGrid?

Я рассмотрел использование метода калькулятора, ноРеализация кажется неуклюжей, когда я заканчиваю тем, что создал новый ParameterViewModel и заменил «старый» vm в коллекции Parameters.Также для справки в классе FPBModel есть много вычисляемых значений, это просто самый простой пример.В идеале был бы способ использовать событие PropertyChanged, но по какой-то причине я не смог попасть туда во вложенных классах.

FPBModel

public class EngineFPB : EngineMechanicalEquipment
{
    private Parameter _minAirflow;
    private Parameter _fanAirflow;
    private Parameter _heatingAirflow;

    public Parameter MinAirflow
    {
        get { return _minAirflow; }
        set { _minAirflow = value; }
    }

    public eParameter FanAirflow
    {
        get { return _fanAirflow; }
        set { _fanAirflow = value; }
    }

    public Parameter HeatingAirflow
    {
        get => _heatingAirflow;
        //set => _heatingAirflow = _minAirflow + _fanAirflow;
    }

    public FPB(Element element)
    {
        UTILUnitConverter UC = new UTILUnitConverter();
        double min = element.min;
        double fan = element.fan;

        _minAirflow = new EngineParameter("Min Airflow", min, false);
        _fanAirflow = new EngineParameter("Fan Airflow", fan, false);

        _heatingAirflow = new EngineParameter("Heating Airflow", 0, false);
        CalculateFields();
    }

    public void CalculateFields()
    { 
        double heatingAirflow = Convert.ToDouble(_minAirflow.Value) + Convert.ToDouble(_fanAirflow.Value);
        _heatingAirflow.Value = heatingAirflow;
    }
}

FPBViewModel

public class FPBViewModel : ViewModelBase
{
    private ObservableCollection<ParameterViewModel> _parameters = new ObservableCollection<ParameterViewModel>();
    public ObservableCollection<ParameterViewModel> Parameters
    {
        get => _parameters;
        set
        {
            _parameters = value;
            RaiseProperty(nameof(Parameters));
        }
    }

    private ParameterViewModel _minAirflow;
    public ParameterViewModel MinAirflow
    {
        get => _minAirflow;
        set
        {
            _minAirflow = value;
            RaiseProperty(nameof(MinAirflow));
        }
    }

    private ParameterViewModel _fanAirflow;
    public ParameterViewModel FanAirflow
    {
        get => _fanAirflow;
        set
        {
            _fanAirflow = value;
            RaiseProperty(nameof(FanAirflow));
        }
    }

    private ParameterViewModel _heatingAirflow;
    public ParameterViewModel HeatingAirflow
    {
        get => _heatingAirflow;
        set
        {
            _heatingAirflow = value;
            RaiseProperty(nameof(HeatingAirflow));
        }
    }

    public FPBViewModel(EngineFPB fpb)
    {
        _minAirflow = new ParameterViewModel(fpb.MinAirflow, false);
        _fanAirflow = new ParameterViewModel(fpb.FanAirflow, false);
        _heatingAirflow = new ParameterViewModel(fpb.HeatingAirflow, true);

        _parameters.Add(MinAirflow);
        _parameters.Add(FanAirflow);
        _parameters.Add(HeatingAirflow);
    }
}

Класс параметров

public class EngineParameter
{
    private string _name;
    private object _value;
    private bool _isReadOnly;

    public string Name
    {
        get => _name;
        set => _name = value;
    }
    public object Value
    {
        get => _value;
        set => _value = value;
    }

    public bool IsReadOnly
    {
        get => _isReadOnly;
        set => _isReadOnly = value;
    }

    public EngineParameter(string name, object value, bool isReadOnly) 
    {
        _name = name;
        _value = value;
        _isReadOnly = isReadOnly;
    }
}

ParameterViewModel

public class ParameterViewModel : ViewModelBase
{
    private Parameter _parameter;
    private bool _isReadOnly;

    public bool IsReadOnly
    {
        get => _isReadOnly;
        set => _isReadOnly = value;
    }

    public string Name
    {
        get => _parameter.Name;
    }

    public object Value
    {
        get => _parameter.Value;
        set
        {
            if (!_isReadOnly)
            {
                _parameter.Value = value;
                RaiseProperty(nameof(Value));
            }
        }
    }

    public ParameterViewModel(Parameter parameter, bool isReadOnly)
    {
        _parameter = parameter;
        _isReadOnly = isReadOnly;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...