c# - LiveCharts SeriesCollection 未在 CartesianChart 上显示
问题描述
修改网站文档中提供的代码后,我无法显示 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);
}
出于所有意图和目的,上面的代码将一系列双打添加到两个列表中,我确定它们正在工作(所以这不是问题;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 代码中使用过,所以我知道这不太可能是问题的原因。
我还没有解决问题所在。我没有正确绑定我的数据吗?
编辑
对于上下文,我知道其中的 SeriesCollectionGraphModel
肯定也包含我想要的信息,因为这段代码与我最初试用的非 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);
}
这段代码的问题在于它创建了一个新对象,它实际上切断了 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
收藏品。
一旦我学会了如何重新绑定数据,我可以将这个方法设为私有并简单地创建一个新对象,但是我每次都会创建整个 SeriesCollection(以及我现在在模型中拥有的其他 Funcs 和东西),所以这个方法理论上可能会更快。
推荐阅读
- reactjs - 显示来自本地的卡片背景图像,用于 API 中的项目列表
- python - 我在 opencv 中捕获视频时遇到问题,如何调试它?
- kdb - KDB/Q:如何组合/追加表?
- android - 如何在firebase中插入整个edittext
- java - PSQLException:在此 ResultSet 中找不到列名 start_value
- python - 该代码是关于使用卡尔曼滤波器跟踪和预测鼠标的轨迹
- java - 禁用 IntelliJ 检查:警告“如果 (a == false) 更改为 if (!a)”。我没有看到跳转到其配置的链接或代码
- azure-active-directory - 使用电话注册 Azure AD B2C
- javascript - 此脚本答案未按预期进行数学运算
- android - 如何在 Android 屏幕上显示 HTTP 请求的异常