修改网站文档中提供的代码后,我很难显示系列收集。让我告诉你我做了什么。
首先,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);
}
出于所有意图和目的,以上代码添加了两个列表一系列双打,我确定这不是问题(所以这不是问题; 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));
}
}
}
该方法ParseData()
在非WPF代码之前已使用过,因此我知道这不太可能引起问题的原因。
我仍然没有解决问题。我不是正确地绑定数据吗?
编辑
对于上下文,我知道GraphModel
中的串联汇编绝对包含我想要的信息,因为它应该是因为此代码与我最初试用的软件的非WPF版本或多或少相同。<<<<<<<<<<<<<<
我解决了自己的问题。问题是我每次要更新图形数据时都运行相同的方法(如上所示(:
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);
}
此代码的问题是它创建了一个新对象,该对象实际上切断了视图与GraphData
的绑定。
我有两个选项:不要创建一个新对象,或创建一个新对象,然后重新命令视图为对象。
因为我无法弄清楚如何重新命名视图,所以我选择了在对象中创建方法以修改数据的选项。我做到了:
public void ParseData(List<CompetitorModel> compData, List<CompetitorModel> dqData)
{
CompetitionData.Clear();
DQData.Clear();
// Convert competitionData into observable points
int count = 0;
foreach (var item in compData)
{
CompetitionData.Add(new ObservablePoint(count++, item.VIs));
}
// Convert dqdata into observable points
int offsetX = compData.Count;
foreach (var item in dqData)
{
DQData.Add(new ObservablePoint(offsetX++, item.VIs));
}
}
简而言之,我制作了涉及我对象中的数据pasrsing的代码部分,该pasrs在我的对象公开中,清除了内部的集合,并且构造了一个新的修改了现有的系列票据,该系列汇编仍然绑定到视图。,不通过更改CompetitionData
和DQData
收集来破坏绑定。
一旦我学习了如何重新启动数据,i 可以将此方法私有并创建一个新对象,但是我也在创建整个系列汇编(以及我内部的其他功能和其他东西现在的模型(每次(,因此该方法在理论上可能更快地。