2

Пишу программу , которая считывает значение с датчика и записывает его как точку графика. Моя проблема в том что график не обновляется. Общение с датчиком происходит через SerialPort и точку я хочу доставать из события по приёму DataReceived. Для графика использую LiveCharts.

Строить пытаюсь через ChartValues<ObservableValues> MyValues в который добавляю значение путём MyValues.Add(new ObservableValue(значение)), но оно не обновляет график через свойство в ViewModel.

Xaml разметка для графика :

 <Grid>
 <Grid.RowDefinitions>
 <RowDefinition Height="Auto"></RowDefinition>
 <RowDefinition Height="Auto"></RowDefinition>
 <RowDefinition Height="*"></RowDefinition>
 </Grid.RowDefinitions>
 <TextBlock TextWrapping="Wrap">
 Fully Responsive
 </TextBlock>
 <StackPanel Grid.Row="1" Orientation="Horizontal">
 <TextBlock VerticalAlignment="Center" Margin="0 0 10 0">Points</TextBlock>
 <Button Command="{Binding DrawPointCommand,Mode=OneWay}" >+</Button>
 <Button>/</Button>
 <Button>-</Button>
 <Button >MoveAll</Button>
 <TextBlock Margin="0 0 10 0" VerticalAlignment="Center">Series</TextBlock>
 <Button>+</Button>
 <Button>-</Button>
 </StackPanel>
 <lvc:CartesianChart Grid.Row="2" LegendLocation="Right">
 <lvc:CartesianChart LegendLocation="Right">
 <lvc:CartesianChart.Series>
 <lvc:LineSeries PointGeometry="{x:Null}" Fill="Transparent"
 StrokeThickness="3" Title="0xC0"
 Values="{Binding MyValues , UpdateSourceTrigger=PropertyChanged,Mode=OneWay}" />
 <lvc:LineSeries PointGeometry="{x:Null}" Fill="Transparent"
 StrokeThickness="3" Title="0xC1"
 Values="{Binding SPoints}" />
 </lvc:CartesianChart.Series>
 </lvc:CartesianChart>
 </lvc:CartesianChart>
 </Grid>
</UserControl>

Пока что попытался сделать через кнопку с командой DrawPointCommand,которая цепляет температуру из датчика. Кнопка вечно рисует нулевое значение.

Метод подписанный на DrawPointCommand:

private void DrawPoint()
{
 MyValues.Add(new ObservableValue(_monitoringblock.Temperature));
}

Часть конструктора которая относится к графикам :

MyValues = new ChartValues<ObservableValue>
{
 new ObservableValue(5), new ObservableValue(7), new ObservableValue(8), new ObservableValue(3)
};
var lineSeries = new LineSeries 
{
 Values = MyValues, StrokeThickness = 4, Fill = Brushes.Transparent, PointGeometrySize = 0, DataLabels = false
};
SeriesCollection = new SeriesCollection { lineSeries };

Свойство MyValues:

public ChartValues<ObservableValue> MyValues
{
 get
 {
 return _myvalue;
 }
 set
 {
 _myvalue = value;
 OnPropertyChanged(nameof(MyValues));
 }
}

В отладке по нажатию кнопки изменяется количество элементов,но судя по графику это всё нули. Через принятые от датчика данные не рисуются даже нули.

Так выглядит событие приема по порту :

private void dataReceived(object sender, EventArgs e)
{
 _myvalue.Add(new ObservableValue(MonitoringViewModel.Concentration));
 OnPropertyChanged("MyValues");
}

Внутри самого приложения данные по приёму обновляются нормально.
Копал в отладке.

Копал в отладке.Получается что в данном случае OnPropertyChanged() не работает?

Получается OnPropertyChanged() работает неправильно? Просто дело в том, что он справлялся до этого и всё обновлял правильно.Точнее даже обновляет всё,кроме графика.

задан 3 дек. 2020 в 10:24
1
  • MyValues = new ChartValues<ObservableValue> - вангую, что подобные свойства у вас без INPC. Commented 3 дек. 2020 в 11:53

1 ответ 1

1

Дело было в DataContext. Если точнее то UserControl который отображается в основном окне не должен его иметь. Так же свойство MyValues дополнительно должно обновиться при помощи NotifyOnSourceUpdated=True.

ответ дан 7 дек. 2020 в 7:48

Ваш ответ

Черновик сохранён
Черновик удалён

Зарегистрируйтесь или войдите

Регистрация через Google
Регистрация через почту

Отправить без регистрации

Необходима, но никому не показывается

Отправить без регистрации

Необходима, но никому не показывается

Нажимая «Отправить ответ», вы соглашаетесь с условиями пользования и подтверждаете, что прочитали политику конфиденциальности.

Начните задавать вопросы и получать на них ответы

Найдите ответ на свой вопрос, задав его.

Задать вопрос

Изучите связанные вопросы

Посмотрите похожие вопросы с этими метками.