#wpf #charts #data-binding
Вопрос:
Я пытался сделать так, чтобы в моем приложении WPF отображалась только базовая диаграмма. К сожалению, в библиотеке, с которой я решил спуститься в эту кроличью нору, оказалось очень мало документации. Все, что я смог найти, это репозиторий GitHub:
https://github.com/mendonca-andre/Charts.WPF
Вот пакет nuget: https://www.nuget.org/packages/Charts.WPF
В любое время, когда я гуглю Графики.Google WPF просто думает, что я ищу любую библиотеку wpf, которая может создавать диаграммы. Тем не менее, я думаю, что у меня почти получилось, но я не могу понять, как привязать данные к диаграмме, которую она может интерпретировать. Я посмотрел в примере и обнаружил, что они использовали списки наблюдений, поэтому я попробовал это, но это не сработало.
Вот мой 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()
{
//this.chartData = chartData;
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, привязкой и диаграммами. Спасибо за помощь!
Комментарии:
1. есть ли у вас ошибки привязки (я ожидал бы некоторых)? Как вы устанавливаете
DataContext
Window
это ? ВашеchartData
поле должно быть свойством, т. е.{ get; set; }
.2. У меня было 0 ошибок привязки. Что, как я предполагаю, означает, что он видел данные, даже без {get; set}, потому что они общедоступны. Может быть, это не очень хорошая практика кодирования, но в данный момент я просто пытаюсь заставить ее работать.
3. Я добавил изображение запущенного приложения. Он показывает 0 ошибок привязки.
4. Извините, не знаю, как я пропустил
DataContext
установку в xaml5. Поэтому добавил {get; set;} в данные диаграммы, и я все еще ничего не вижу
Ответ №1:
Мне удалось заставить это работать, посмотрев примеры в репозитории git. На вашем месте я бы скачал репо и поиграл. Существует общий файл.xaml, в котором показано, как создавать диаграммы каждого типа.
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:charts="clr-namespace:Charts.WPF.ChartControls;assembly=Charts.WPF"
xmlns:pieChart="clr-namespace:Charts.WPF.Core.PieChart;assembly=Charts.WPF"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<pieChart:PieChart ChartTitle="Test" ChartSubTitle="Test" ChartLegendVisibility="Visible">
<pieChart:PieChart.Series>
<charts:ChartSeries
SeriesTitle="Test"
DisplayMember="Text"
ValueMember="Value"
ItemsSource="{Binding Path=chart}">
</charts:ChartSeries>
</pieChart:PieChart.Series>
</pieChart:PieChart>
</Grid>
</Window>
Это проще, если вы используете свой Window
в качестве DataContext
public partial class MainWindow : Window
{
public Dictionary<int, int> chart { get; set; } = new Dictionary<int, int>();
public MainWindow()
{
chart.Add(1, 1);
chart.Add(2, 2);
chart.Add(3, 3);
InitializeComponent();
}
}
Однако имейте в виду, что это сработает только в том случае, если вы добавите все свои значения в словарь перед вызовом InitializeComponent
. Это связано Dictionary
с тем, что оно не просматривается, т. е. ваше представление не будет уведомляться о добавлении или удалении элементов.
Надеюсь, этого будет достаточно, чтобы исследовать другие типы графиков.
Комментарии:
1. Потрясающе. Спасибо за ответ. Я займусь этим прямо сейчас и в ближайшее время продолжу.
2. Итак, я вижу заголовок диаграммы, но диаграммы нет. Это все, что у тебя есть?