c# - 如何使用类在 C# WPF 中减小 ViewModel 的大小
问题描述
继我上周发布的上一个问题之后,我有一个图表/图形应用程序,我的目标是从三个传感器读取数据并绘制它。
我将能够毫不费力地做到这一点,但以前我没有遵循 MVVM 原则,因为我是 WPF 的新手,并且在后面的代码中绝对拥有一切。现在我正在使用 MVVM 重写我的 Chart/Graph 应用程序。
我遇到的困难是尝试拆分 MainWindowViewModel 以处理其他类中的其他内容,以避免类冗长而复杂。
我有以下内容:
模型
public class MainWindowModel
{
public ObservableCollection<SensorDataModel1> ocSensor1{ get; set; }
public ObservableCollection<SensorDataModel2> ocSensor2{ get; set; }
public ObservableCollection<SensorDataModel3> ocSensor3{ get; set; }
}
视图模型
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/3Class 来减少 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 中,我可以在这里保存它,但是我是否需要为 Axis、LineSeries、Label 等创建一个单独的模型和 ViewModel 并将 DataContext 设置为每个单独的以获得类似的东西?
我基本上是在尝试将 MVVM 与更多 OO 原则结合起来,但是这样做可能完全违反了 MVVM。我想知道最好的方法是用很多类来构建我的应用程序并且仍然更新相同的视图。
解决方案
推荐阅读
- ios - 异步返回用户的经纬度
- python-3.x - 如何将 importlib.resources 与 pickle 文件一起使用?
- amazon-web-services - 假设我是 AWS IAM 用户,有什么方法可以让我使用 CLI 或控制台检查已授予我哪些资源权限
- python-3.x - 为什么 hyperopt 在随机森林中运行时会给出最好的损失 Nan?
- ruby-on-rails - AWS:Ruby describe_instance_type_offerings() 给出异常:“未定义的方法”
- vue.js - Vue Router Meta 对象未定义
- c++ - 扩展/专业化`模板
zero()` 到可调用的 `T` - flutter - 使用 PageView、Swiper 或 Liquid_swiper 时是否可以禁用页面?
- python - R 和 Python 中的列向量
- django - Django - 查询集中两个特定字段的划分