Следуя предыдущему вопросу, который я разместил на прошлой неделе, у меня есть приложение для работы с диаграммами / графиками, в котором я собираюсь прочитать данные с трех датчиков и построить их.
Я смогу сделать это без особых затруднений, но раньше я не следовал принципам 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 в целом. Я хочу знать, как лучше всего структурировать мое приложение множеством классов и при этом обновлять то же представление.