WPF с живыми диаграммами добавляет ряды с привязкой к данным во время выполнения

#c# #wpf #data-binding #binding #livecharts

#c# #wpf #привязка данных #привязка #живые диаграммы

Вопрос:

У меня есть проект, в котором у меня есть область построения графиков. Я выбрал живые диаграммы ( http://lvcharts.net ) если уж на то пошло.

Пока все хорошо, построение графиков работает с привязкой данных при добавлении в xaml: введите описание изображения здесь

 <UserControl x:Class="Work_Task_Planner_Sheduler.Views.TeamTaskProgressChartView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Work_Task_Planner_Sheduler.Views"
             xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <lvc:CartesianChart x:Name="TeamTaskProgressChartComponent">
            <lvc:CartesianChart.Series>
                <lvc:LineSeries Title="Julian" Values="{Binding Taskprogress_julian}" />
            </lvc:CartesianChart.Series>
            <lvc:CartesianChart.AxisX>
                <lvc:Axis Title="Time"></lvc:Axis>
            </lvc:CartesianChart.AxisX>
            <lvc:CartesianChart.AxisY>
                <lvc:Axis Title="TaskProgress"></lvc:Axis>
            </lvc:CartesianChart.AxisY>
        </lvc:CartesianChart>
    </Grid>
</UserControl>
  

Проблема в том, что ряды строк жестко закодированы в xaml. Кто знает, становится ли команда больше / меньше со временем или меняются члены команды. Поэтому я хочу создать линейный ряд во время выполнения.

Это то, что у меня есть до сих пор, к сожалению, серия остается пустой:

 CartesianChart chart = this.TeamTaskProgressChartComponent;
foreach(string user in TeamMembers)
{
    LineSeries lineseries = new LineSeries();
    string title = user.Split('.')[0];
    lineseries.Title = title;
    Binding databinding = new Binding();
    databinding.Source =
    Datarefresh.mainWindow.mainViewModel.TeamTaskProgressChartViewModel.TaskProgressCounts;
    DependencyProperty LineSeriesProperty = DependencyProperty.Register(title "Property", typeof(int), typeof(LineSeries), new PropertyMetadata(0));
    lineseries.SetBinding(LineSeriesProperty, databinding);
    chart.series.Add(lineseries);
}
  

Ответ №1:

Вы должны установить источник для привязки.

 CartesianChart chart = new CartesianChart();
foreach(string user in TeamMembers)
{
    LineSeries lineseries = new LineSeries();
    string title = user.Split('.')[0];
    lineseries.Title = title;
    Binding databinding = new Binding("Taskprogress_" title);

    //===========Set source here before setting the binding to the lineseries===========
    databinding.Source = "your datasource";

    // the following line is pseudocode derived from Microsoft reference
    // https://learn.microsoft.com/en-us/dotnet/desktop/wpf/data/how-to-create-      a-binding-in-code?view=netframeworkdesktop-4.8
    lineseries.SetBinding(LineSeries.Values, databinding); 
}
  

Комментарии:

1. Я обновил свой код сверху. Теперь я могу скомпилировать и запустить приложение, но ряды остаются пустыми. это работает при определении того же в xaml

Ответ №2:

На самом деле процесс довольно прост:

  1. Создайте сопоставление рядов. ВАЖНО: коллекция рядов должна быть инициализирована в конструкторе, чтобы она была готова при загрузке диаграммы:

     public class TeamTicketResolveChartViewModel
    {
        public SeriesCollection ChartSeries { get; set; }
        public string[] TicketResolveLabels { get; set; }
    
        public TeamTicketResolveChartViewModel()
        {
            ChartSeries = new SeriesCollection();
            foreach (string user in TeamMembers.ServiceDesk)
            {
                LineSeries lineseries = new LineSeries();
                string title = user.Split('.')[0];
                lineseries.Title = title;
                ChartSeries.Add(lineseries);
            }
        }
        // other functions
    }
      
  2. В xaml привяжите диаграмму к коллекции рядов:

     <lvc:CartesianChart x:Name="TeamTicketResolveChartComponent" Series="{Binding ChartSeries}" />
      
  3. Теперь обновление данных диаграммы будет работать по назначению:

     public void LoadChartData2(List<List<(DateTime time, int resolved)>> input)
    {
        for (int i = 0; i < input.Count; i  )
        {
            ChartSeries[i].Values = new ChartValues<int>(input[i].Select(c => c.resolved));
        }
    
        DateTime[] dates = input[0].Select(c => c.time).ToArray();
        List<string> labels = new List<string>();
        foreach (DateTime time in dates) labels.Add(time.ToString("HH:mm:ss"));
        TicketResolveLabels = labels.ToArray();
    }
    public void AddChartPoint(List<List<(DateTime time, int resolved)>> input)
    {
        // Chartseries[i].values.Add()
    }