在修改了网站文档提供的代码后,我无法正常显示SeriesCollection。让我展示一下我所做的。
首先是XAML:
<Grid>
<lvc:CartesianChart Series="{Binding GraphData.SeriesCollection}"
LegendLocation="Top">
<lvc:CartesianChart.AxisY>
<lvc:Axis Title="VIs"></lvc:Axis>
</lvc:CartesianChart.AxisY>
<lvc:CartesianChart.AxisX>
<lvc:Axis Title="Players"></lvc:Axis>
</lvc:CartesianChart.AxisX>
</lvc:CartesianChart>
</Grid>
在我的ViewModel中,我有一个自定义对象存储了我希望绑定到这个图表上的信息:
public GraphModel GraphData { get; set; } = new GraphModel();
我有一个按钮来测试我的代码。单击它会执行以下代码:
private void UpdateGraphStatistics()
{
var compdata = new List<double>();
var dqdata = new List<double>();
foreach (var item in Competitors)
{
if (!item.DQ)
{
compdata.Add(item.VIs);
}
else if (item.DQ)
{
dqdata.Add(item.VIs);
}
}
GraphData = new GraphModel(compdata, dqdata);
}
就所有目的而言,以上代码将一系列double值添加到两个列表中,我已确定这部分是有效的(因此这不是问题;SeriesCollection不为空!)
接下来是GraphModel。这是一个大问题,问题可能出在这里,但我无法确定原因:
class GraphModel
{
public ChartValues<ObservablePoint> CompetitionData = new ChartValues<ObservablePoint>();
public ChartValues<ObservablePoint> DQData = new ChartValues<ObservablePoint>();
public SeriesCollection SeriesCollection { get; set; }
public GraphModel()
{
CreateSeriesCollection();
}
public GraphModel(List<double> competitionData, List<double> dqData)
{
ParseData(competitionData, dqData);
CreateSeriesCollection();
}
private void CreateSeriesCollection()
{
SeriesCollection = new SeriesCollection
{
new LineSeries
{
Title = "Competition Data (VIs/Player Number)",
Values = CompetitionData,
LineSmoothness = 0.6,
PointForeground = Brushes.Blue
},
new LineSeries
{
Title = "DQ Data (VIs/Player Number)",
Values = DQData,
LineSmoothness = 1,
PointForeground = Brushes.Red
}
};
}
private void ParseData(List<double> compData, List<double> dqData)
{
// Convert competitionData into observable points
int count = 1;
foreach (var item in compData)
{
CompetitionData.Add(new ObservablePoint(count++, item));
}
// Convert dqdata into observable points
int offsetX = CompetitionData.Count;
foreach (var item in dqData)
{
DQData.Add(new ObservablePoint(offsetX++, item));
}
}
}
之前在非WPF代码中已经使用过ParseData()
方法,因此我知道这不太可能是问题的原因。
我仍然没有解决问题。难道我的数据绑定方式不正确吗?
编辑
为了更好地理解,我知道GraphModel
中的SeriesCollection
肯定包含我想要的信息,因为这段代码与我最初试用的非WPF版本的软件基本相同。
SeriesCollection
没有实现INotifyCollectionChanged
有关吗? - BenderBoy