Почему шаблон MVVM не работает для ChartValues? - PullRequest
0 голосов
/ 19 июня 2020

У меня есть некоторые проблемы с MVVM, я пытаюсь построить значения x и y на диаграмме, я заполняю свой список chartValues ​​, но когда я пытаюсь установить его в моем CurrentLUT и я загружаю программу, значения x и y не отображаются, только пустая диаграмма. Я связал Title с CurrentLUT , так что в легенде диаграммы появляется CurrentLUT (выбранный элемент из поля со списком), и я попытался сделать то же самое с точками моей диаграммы, но я не могу найти свою ошибку.

xaml

<ComboBox ItemsSource="{Binding AllLUTLibraries}" SelectedItem="{Binding CurrentLUT}"/>
<lvc:CartesianChart Series="{Binding SeriesCollection}"/>

xaml.cs

 public List<ILUTLibrary> AllLUTLibraries { get; } = Objects.LUTLibraries.Instance.AllLUTLibraries; 

 private ILUTLibrary currentLUT = Objects.LUTLibraries.Instance.AllLUTLibraries[0];
 public ILUTLibrary CurrentLUT

 {
        get
        {
               return currentLUT;
        }
        set
        {
               currentLUT = value;
               lineSeries.Title = currentLUT.ToString();
               lineSeries.Values = chartValues;
               OnPropertyChanged();
        }
 }

 private SeriesCollection seriesCollection;
 public SeriesCollection SeriesCollection
 {
        get
        {
               return seriesCollection;
        }
        set
        {
               seriesCollection = value;
               OnPropertyChanged();
        }
 }

 public LineSeries lineSeries = new LineSeries //line properties
 {
 };

 public NewLUT_ViewModel() //constructor
 {     
        SeriesCollection = new SeriesCollection { lineSeries };
 }

 private ChartValues<ObservablePoint> chartValues;
 public ChartValues<ObservablePoint> ChartValues
 {
        get
        {
               var x = ((ILUTLibOneD)CurrentLUT).XValues;
               var y = ((ILUTLibOneD)CurrentLUT).YValues;

               for (int i = 0; i < x.Length; i++)
               {
                      chartValues.Add(new ObservablePoint { X = x[i], Y = y[i] });
               }
               return chartValues;
        }
        set
        {
               chartValues = value;
               OnPropertyChanged();
        }
 }

1 Ответ

0 голосов
/ 19 июня 2020

Похоже, ваша проблема в том, что вы никогда не обновляете привязку для своего CartesianChart, которая является свойством SeriesCollection. Посмотрите на свой xaml, у вас есть:

<lvc:CartesianChart Series="{Binding SeriesCollection}"/>

Когда вы выбираете новый CurrentLUT из ComboBox, установщик обновляет только lineSeries, а затем отправляет событие PropertyChanged ТОЛЬКО для CurrentLUT.

set
{
       currentLUT = value;
       lineSeries.Title = currentLUT.ToString();
       lineSeries.Values = chartValues;
       OnPropertyChanged(); // THIS ONLY UPDATES THE CurrentLUT BINDING!
}

Вам нужно, чтобы он также сообщил CartesianChart о необходимости обновления, поэтому, возможно, сделайте что-то вроде этого:

set
{
       currentLUT = value;
       lineSeries.Title = currentLUT.ToString();
       lineSeries.Values = chartValues;
       OnPropertyChanged();

       // Also update the CartesianChart
       OnPropertyChanged(nameof(this.SeriesCollection));
}
...