Как уменьшить размер ViewModel в C # WPF с помощью классов - PullRequest
0 голосов
/ 16 мая 2019

Следуя предыдущему вопросу, который я разместил на прошлой неделе, у меня есть приложение для работы с диаграммами / графиками, в котором я собираюсь прочитать данные с трех датчиков и построить их.

Я смогу сделать это без особых затруднений, но раньше я не следовал принципам MVVM, так как был новичком в WPF и имел абсолютно все в коде. Сейчас я переписываю свое приложение Chart / Graph с использованием MVVM.

Трудность, с которой я сталкиваюсь, заключается в попытке разделить MainWindowViewModel для обработки чего-либо в других классах, чтобы избежать того, чтобы класс был длинным и сложным.

У меня есть следующее:

MODEL

public class MainWindowModel
{
    public ObservableCollection<SensorDataModel1> ocSensor1{ get; set; }
    public ObservableCollection<SensorDataModel2> ocSensor2{ get; set; }
    public ObservableCollection<SensorDataModel3> ocSensor3{ get; set; }
}

ViewModel

public class MainWindowViewModel : ObservableObject
{

    public ObservableCollection<Sensor1DataModel> ocSensor1Data
    {
        get { return _model.ocSensor1; }
        set
        {
            _model.ocSensor1 = value;
            OnPropertyChanged("ocSensor1Data");
        }
    }

    private void SerialDataReceivedHandler(object sender, 
    SerialDataReceivedEventArgs e)
    {
        // parse all sensor data from Arduino to a list
        List<string> arduinoData = e.ToString().Split(',').ToList();

        // parses data here into 3 variables

        // sends to each sensors class (pseudocode to simplify example)
        sensor1Class.AddData(data1);
        sensor2Class.AddData(data2);
        sensor3Class.AddData(data3);
    }
}

Пример класса датчика

// Does some conversions to the data and then updates the ObservableCollection 
// in the MainWindowViewModel
public class Sensor1Class
{
        MainWindowViewModel main;
        public Sensor1Class()
        {
            main = new MainWindowViewModel();
        }

                public void AddData(List<string> data)
        {
            SensorDataModel1 model = new SensorDataModel1();

            // does some stuff to the data here

            // add parsed data to observable collection in viewmodel to be used by UI
            main.ocSensor1Data.Add(model);
        }
}

Так что здесь у меня есть базовая архитектура MVVM, у меня есть класс Sensor1 / 2/3, чтобы уменьшить некоторую работу в MainWindowViewModel, где необходимо выполнить некоторые преобразования для данных, которые считываются.

В идеале я хотел бы иметь свои собственные классы Axis, Label, LineSeries, ChartZoom и т. Д., Чтобы извлечь большой объем кода из MainWindowViewModel.

Пример: иметь класс Axis.cs для хранения данных, специфичных для оси

public class Axis
{
    // TODO - Axis class
    private double AxisMin;
    private double AxisMax;


    #region setters
    public void SetAxisLimits(double min, double max)
    {
        AxisMin = min;
        AxisMax = max;
    }

    public void SetAxisMin(double value)
    {
        AxisMin = value;
    }

    public void SetAxisMax(double value)
    {
        AxisMax = value;
    }
    #endregion

    #region getters
    public double GetAxisMin()
    {
        return AxisMin;
    }

    public double GetAxisMax()
    {
        return AxisMax;
    }

    #endregion
}

Таким образом, вместо того, чтобы все это быть в MainWindowViewModel, я могу держать его здесь, однако мне нужно будет создать отдельную Model & ViewModel для Axis, LineSeries, Label и т. Д. И установить DataContext для каждого отдельно, чтобы иметь что-то вроде этого

Я в основном пытаюсь объединить MVVM с большим количеством ОО-принципов, но тогда я, возможно, нарушу MVVM в целом. Я хочу знать, как лучше всего структурировать мое приложение множеством классов и при этом обновлять то же представление.

...