为什么 MVVM 模式不适用于 ChartValues?
Why is MVVM pattern not working for ChartValues?
我有一些 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();
}
}
您的问题似乎是您从未更新 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));
}
我有一些 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();
}
}
您的问题似乎是您从未更新 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));
}