使用Charts.WPF库无法显示WPF图表,数据绑定异常问题求助
问题描述
我一直在尝试在WPF应用中显示基础图表,选用的Charts.WPF库相关文档极少,可在GitHub搜索仓库名mendonca-andre/Charts.WPF获取源码,也可在Nuget平台直接搜索Charts.WPF安装对应包。
每次搜索Charts.WPF时,搜索引擎都会默认返回所有支持WPF开发的图表库相关结果。目前我几乎完成配置,但不知道如何绑定该图表库可识别的数据,参考示例使用ObservableLists后仍未生效。
我的XAML代码如下:
<Window x:Class="Eartquake_Tracker.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:chart="clr-namespace:Charts.WPF.ChartControls;assembly=Charts.WPF" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Eartquake_Tracker" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <Grid.Resources> <local:BuildGraph x:Key="functions"/> </Grid.Resources> <Grid.DataContext> <Binding Source="{StaticResource functions}"/> </Grid.DataContext> <chart:ChartSeries SeriesTitle ="La Palma Quakes" Width="300" Height="300" ItemSource="{Binding Path=chartData}"/> </Grid>
绑定类代码如下,目前使用简单线性数据测试显示效果:
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Eartquake_Tracker { class BuildGraph : System.Windows.Data.DataSourceProvider { public Dictionary<int, int> chart = new Dictionary<int, int>(); public ObservableCollection<Dictionary<int, int>> chartData = new ObservableCollection<Dictionary<int, int>>(); public BuildGraph() { chart.Add(0, 0); chart.Add(1, 1); chart.Add(2, 2); chart.Add(3, 3); chart.Add(4, 4); chart.Add(5, 5); chartData.Add(chart); } } }
运行后图表无数据显示,我对WPF、数据绑定和图表相关开发熟悉度较低,寻求帮助。
解决方案
你遇到的问题属于WPF绑定规则不熟悉 + 库数据源格式不匹配两个问题,修改如下即可正常显示:
- WPF数据绑定仅支持公共属性,不支持公共字段,你定义的
chartData是字段,需要改为带get访问器的属性。 - Charts.WPF的
ChartSeries.ItemSource要求传入元素为Charts.WPF.Models.DataPoint类型的集合,你当前使用嵌套Dictionary的格式无法被识别。 - 不需要额外继承
DataSourceProvider,直接使用普通类即可。
修正后的绑定类代码
using Charts.WPF.Models; using System.Collections.ObjectModel; namespace Eartquake_Tracker { class BuildGraph { // 改为属性,元素类型改为DataPoint public ObservableCollection<DataPoint> chartData { get; set; } = new ObservableCollection<DataPoint>(); public BuildGraph() { // 直接添加DataPoint对象,分别指定X和Y值 chartData.Add(new DataPoint(0, 0)); chartData.Add(new DataPoint(1, 1)); chartData.Add(new DataPoint(2, 2)); chartData.Add(new DataPoint(3, 3)); chartData.Add(new DataPoint(4, 4)); chartData.Add(new DataPoint(5, 5)); } } }
可选XAML优化
可以显式指定图表类型,比如要显示折线图就添加SeriesType属性:
<chart:ChartSeries SeriesTitle ="La Palma Quakes" SeriesType="Charts.WPF.Enums.SeriesType.Line" Width="300" Height="300" ItemSource="{Binding Path=chartData}"/>
如果要显示柱状图就把SeriesType改为Bar即可。
内容的提问来源于stack exchange,提问作者JMC0352
相关产品推荐
相关产品推荐

