【发布时间】:2019-05-08 13:46:25
【问题描述】:
我正在创建一个程序,它从连接到 3 个不同传感器的 Arduino 读取 .csv 数据。 此数据从 Serial 类读取并发送到 ParseData 类,该类将 .csv 数据添加到 List 和 将其发送到每个传感器的 3 个类。 (所有三个传感器的数据同时从 Arduino 发送并从 ParseData 类解析)
三个类:Sensor1、Sensor2、Sensor3
数据模型:SensorDataModel1、SensorDataModel2、SensorDataModel3
我想用三个不同类的数据更新 MainWindow.xaml/MainWindow.xaml.cs 中的图表作为图表上的一条线。我想在 MainWindow 中收到这三个传感器有新数据的通知,然后用数据更新图表。我不确定我是否必须为每个传感器或类似的东西订阅一个事件。
// SerialCommunication.cs - read in data and send to ArduinoDataReceived() method for parsing
private void OnDataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
SerialPort sp = (SerialPort)sender;
string serialBuffer = sp.ReadLine();
// Send the subscriber the data received
if (DataReceived != null)
{
DataReceived?.Invoke(this, new SerialDataReceivedEventArgs()
{
dataReceived = serialBuffer
});
}
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
}
// ParseData.cs - subscribed to SerialCommunication.cs event and receives the data string and sends data to each sensors class
private void ArduinoDataReceived(object sender, SerialDataReceivedEventArgs e)
{
Sensor1 sensor1 = new Sensor1();
Sensor2 sensor2 = new Sensor2();
Sensor3 sensor3 = new Sensor3();
// parse all sensor data from Arduino to a list which holds all three sensors data
List<string> sensorData = e.ToString().Split(',').ToList();
// parse list for each sensor and send off to each class to process the data
sensor1.AddData(sensorData1);
sensor2.AddData(sensorData2);
sensor3.AddData(sensorData3);
}
// SensorData1.cs - an example of storing the data and adding it to a List of the Sensors data model
public List<SensorDataModel1> ListSensorData1 = new List<SensorDataModel1>();
public void AddData(List<string> data, long dataLength)
{
SensorDataModel1 s1 = new SensorDataModel1();
s1.Add(data[0]);
s1.Add(data[1]);
s1.Add(data[2]);
ListSensorData1.Add(s1);
}
我希望所有三个 Data 类都将数据发送回 MainWindow,并让 MainWindow 在每次从串行端口读取这些值时使用这些值更新图表。
【问题讨论】:
-
您想要 MainWindow ViewModel 或后面的代码,无论您使用哪个类来拥有每个类的实例并订阅它们更新/接收的方法,然后使用它作为重绘/将信息添加到您的图表中。
-
感谢您的评论。我在 MainWindow 中的每个类都有一个实例,所有三个类都有一个 AddData() 方法来更新列表,但我在这些类中没有任何事件要订阅?
-
也许 SerialCommunication 类中有什么东西?
-
所以我应该改变我的架构,在我的解析数据类中订阅串行接收事件,然后我应该通过事件而不是调用和 AddData() 方法将数据传递给每个传感器类?我认为某种 INotifyPropertyChanged 或 ObservableCollection 可以解决我的问题,但我不太确定如何实现它
-
您回复的后半部分似乎是个不错的尝试。为每个传感器在您的类上创建 3 个属性,
propfull代码 sn-p 会有所帮助,然后让您的类实现 INotifyPropertyChanged 并且每个属性都在集合上调用它,docs.microsoft.com/en-us/dotnet/api/… 应该可以帮助您弄清楚如何实现它.
标签: c# wpf xaml mvvm data-binding