#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:
На самом деле процесс довольно прост:
-
Создайте сопоставление рядов. ВАЖНО: коллекция рядов должна быть инициализирована в конструкторе, чтобы она была готова при загрузке диаграммы:
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 }
-
В xaml привяжите диаграмму к коллекции рядов:
<lvc:CartesianChart x:Name="TeamTicketResolveChartComponent" Series="{Binding ChartSeries}" />
-
Теперь обновление данных диаграммы будет работать по назначению:
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() }