Не удается заставить мою диаграмму отображаться в Charts.WPF

#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 установку в xaml

5. Поэтому добавил {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. Итак, я вижу заголовок диаграммы, но диаграммы нет. Это все, что у тебя есть?