修改website's documentation上提供的代码后,我在显示SeriesCollection时遇到了麻烦。让我告诉你我做了什么。
首先,XAML:
import axios from "axios";
const KEY = "";
const getPlayListItems = async playlistID => {
const result = await axios.get(`https://www.googleapis.com/youtube/v3/playlistItems`, {
params: {
part: 'id,snippet',
maxResults: 10,
playlistId: playlistID
key: KEY
}
});
return result.data;
};
getPlayListItems("PlaylistID").then(data => {
data.items.forEach(element => {
console.log(element.snippet.resourceId.videoId)
});
在ViewModel中,我有一个自定义对象,用于存储要绑定到此图表的信息,如下所示:
<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>
我有一个按钮来测试我的代码。单击它会执行以下代码:
public GraphModel GraphData { get; set; } = new GraphModel();
出于所有意图和目的,上面的代码将两个确定为有效的双打添加到两个列表中(所以这不是问题; SeriesCollection不是空的!)
接下来是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);
}
以前在非WPF代码中使用了方法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()
中的SeriesCollection也肯定包含我想要的信息,因为它应该与我最初使用的非WPF版本的软件大致相同,因此应该如此试穿了。
答案 0 :(得分:0)
我解决了自己的问题。问题是,每次我想更新图形数据时都运行相同的方法(如上所示):
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);
}
此代码的问题在于它创建了一个新对象,该对象实际上切断了View与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));
}
}
简而言之,我将处理对象内数据丢失的代码部分公开,它清除了内部的集合,并构造了一个新的,修改了仍绑定到视图的现有SeriesCollection。通过更改CompetitionData
和DQData
集合,而不会破坏绑定。
一旦我学会了如何重新绑定数据,我就会 COULD 将此方法设为私有,并简单地创建一个新对象,但随后我还将创建整个SeriesCollection(以及我拥有的其他Funcs和其他东西)因此,此方法从理论上讲可能是更快的过程。