为什么 MVVM 模式不适用于 ChartValues?

Why is MVVM pattern not working for ChartValues?

我有一些 MVVM 问题,我试图在图表上绘制 x 和 y 值,我填充了我的列表 chartValues,但是当我尝试将它设置为我的 CurrentLUT 和我加载程序 x 和 y 值没有出现,只有空图。我已将 TitleCurrentLUT 绑定,因此在图表的图例中会出现 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();
        }
 }

您的问题似乎是您从未更新 CartesianChart 的绑定,即 SeriesCollection 属性。看看你的 xaml,你有:

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

当您 select 来自 ComboBox 的新 CurrentLUT 时,setter 仅更新 lineSeries,然后仅为 CurrentLUT 发送 PropertyChanged 事件。

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));
}