Почему коллекция LiveCharts SeriesCollection не может работать внутри шаблона данных ItemsControl? - PullRequest
0 голосов
/ 14 января 2019

Редактировать: мои графики работают, но они не отвечают квесту в заголовке. Я изменил свой xaml на следующий из приведенного ниже.

<chartWPF:CartesianChart Height="{Binding Path=MainVM.Scaler.HalfScreenLTHeight}" Width="{Binding Path=MainVM.Scaler.HalfScreenLTWidth}" Foreground="Black">
    <chartWPF:CartesianChart.Series >
        <chartWPF:LineSeries Values="{Binding Path=DBWindow.HourGross}" StrokeThickness="{Binding Path=MainVM.Scaler.StrokeSize}" Title="Target" PointGeometrySize = "{Binding Path=MainVM.Scaler.LineDotSize}" PointForeground = "DeepSkyBlue" Stroke="DeepSkyBlue" Fill="Transparent" LineSmoothness="0" />
        <chartWPF:StackedColumnSeries Values="{Binding Path=DBWindow.HourCounts}" StrokeThickness="0" StrokeDashArray="0" Title="Good Parts" Fill="Green" PointGeometry="{x:Null}" />
        <chartWPF:StackedColumnSeries Values="{Binding Path=DBWindow.HourScrap}" StrokeThickness="0" StrokeDashArray="0" Title="Scrap Parts" Fill="Red" PointGeometry="{x:Null}" />      
    </chartWPF:CartesianChart.Series>
    <chartWPF:CartesianChart.AxisX>
        <chartWPF:Axis Title="Hourly Counts" Labels="{Binding Path=DBWindow.Hours}" ShowLabels="True" Typography.Kerning="False" Foreground="Black" FontSize="{Binding Path=MainVM.Scaler.ScrapButtonFontSize3}" LabelFormatter="{Binding Path=DBWindow.HoursLabels}" MinValue="0">
            <chartWPF:Axis.Separator>
                <chartWPF:Separator Step="1"></chartWPF:Separator>
            </chartWPF:Axis.Separator>
        </chartWPF:Axis>
    </chartWPF:CartesianChart.AxisX>
    <chartWPF:CartesianChart.AxisY>
        <chartWPF:Axis Title="Parts" Foreground="Black" FontSize="{Binding Path=MainVM.Scaler.ScrapButtonFontSize3}" MinValue="0">
        </chartWPF:Axis>
    </chartWPF:CartesianChart.AxisY>
</chartWPF:CartesianChart>

ОРИГИНАЛЬНЫЙ ПОЧТА: Я пытаюсь перейти от показа диаграммы одной машины на экране к показу 4 машин одновременно. Я использую LiveCharts.WPF NuGet. Я использую WPF с настройкой MVVM. На графике должен быть столбец с накоплением для каждого часа хороших деталей и брака с серией линий, равной ожидаемой брутто для этих часов.

Я пробовал как с itemcontrol, так и с 4 отдельными диаграммами, настроенными на просмотр определенных машин в наблюдаемой коллекции "MachList [0]"

Если я изменюсь

chartWPF:CartesianChart Series="{Binding Path=DBWindow.SeriesHoursCollection}"

до

chartWPF:CartesianChart Series="{Binding Path=MainVM.SelectedMach.DBWindow.SeriesHoursCollection}"

График показывает только выбранный в данный момент компьютер на 4-м графике, независимо от того, какой компьютер я выбрал, хотя он должен быть на всех графиках. Я могу добавить счетчики к этой машине и обновления графиков без сбоев.

XAML:

<ItemsControl ItemsSource="{Binding Path=MachList}" >
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Orientation="Horizontal" HorizontalAlignment="Center"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <chartWPF:CartesianChart Series="{Binding Path=DBWindow.SeriesHoursCollection}" LegendLocation="Bottom" 
                                                    Height="{Binding Path=MainVM.Scaler.HalfScreenLTHeight}" Width="{Binding Path=MainVM.Scaler.HalfScreenLTWidth}" Foreground="Black">
                    <chartWPF:CartesianChart.AxisX>
                        <chartWPF:Axis Title="Hourly Counts" 
                                                            Labels="{Binding Path=DBWindow.Hours}" ShowLabels="True" Typography.Kerning="False"
                                                            Foreground="Black" FontSize="{Binding Path=MainVM.Scaler.ScrapButtonFontSize3}"
                                                            LabelFormatter="{Binding Path=DBWindow.HoursLabels}" MinValue="0">
                             <chartWPF:Axis.Separator>
                                 <chartWPF:Separator Step="1"></chartWPF:Separator>                                                        
                             </chartWPF:Axis.Separator>
                         </chartWPF:Axis>
                     </chartWPF:CartesianChart.AxisX>
                     <chartWPF:CartesianChart.AxisY>
                          <chartWPF:Axis Title="Parts" Foreground="Black" FontSize="{Binding Path=MainVM.Scaler.ScrapButtonFontSize3}" MinValue="0">
                          </chartWPF:Axis>            
                     </chartWPF:CartesianChart.AxisY>
                 </chartWPF:CartesianChart>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

DBWindow:

public SeriesCollection SeriesHoursCollection
{
    get { return _seriesHoursCollection; }
    set
    {
        _seriesHoursCollection = value;
        OnPropertyChanged("");
    }
}
public Func<double, string> HoursLabels
{
        get { return _hLables; }
        set
        {
           _hLables = value;
           OnPropertyChanged();
        }
}
public ChartValues<double> HourCounts
{
        get { return _hourCouts; }
        set
        {
           _hourCouts = value;
           OnPropertyChanged();
        }
}
public ChartValues<double> HourScraps
{
        get { return _hourScraps; }
        set
        {
           _hourScraps = value;
           OnPropertyChanged();
        }
}
public ChartValues<double> HourGross
{
        get { return _hourGross; }
        set
        {
            _hourGross = value;
            OnPropertyChanged();
        }
}
public List<string> Hours
{
            get { return _hours; }
            set
            {
                _hours = value;
                OnPropertyChanged();


   }
}
//Function is called to update the charts when counts are changed for a machine
public void HourStackBars()
{
        if (SeriesHoursCollection.Chart != null)
        { SeriesHoursCollection.Clear(); }

        Hours = new List<string>();
        HourCounts = new ChartValues<double>();
        HourScraps = new ChartValues<double>();
        HourGross = new ChartValues<double>();
        var maxGross = 0;
        var hour = 1;

        for (int i=0; i< _machVM.HourCountGraph.Count; i++)
        {
            if(i == 0) { maxGross = _machVM.HourCountGraph[i].Gross; }
            HourCounts.Add(_machVM.HourCountGraph[i].GoodParts);
            HourScraps.Add(_machVM.HourCountGraph[i].ScrapParts);
            HourGross.Add(_machVM.HourCountGraph[i].Gross);
            Hours.Add(Convert.ToString(_machVM.HourCountGraph[i].Hour));
            hour++;
        }


        for (int t = hour; t <= _machVM.MainVM.ShiftHourCount; t++)
        {
            if (_machVM.RunningPart != "")
            {
                maxGross = Convert.ToInt32(_machVM.MainVM.SelectedPart.PartGross);
                HourGross.Add(maxGross);
            }
            Hours.Add(Convert.ToString(hour));
            hour++;
        }


        if (HourCounts.Count > 0 && HourGross.Count > 0)
        {

            SeriesHoursCollection = new SeriesCollection
            {
                new LineSeries
                {
                    Title = "Target",
                    Values = HourGross,
                    Stroke = Brushes.DeepSkyBlue,
                    StrokeThickness = _machVM.MainVM.Scaler.StrokeSize,
                    PointGeometrySize = _machVM.MainVM.Scaler.LineDotSize,
                    FontSize = _machVM.MainVM.Scaler.ReportHeadFontSize,
                    PointForeground = Brushes.DeepSkyBlue,
                    UseLayoutRounding = false,
                    Fill = Brushes.Transparent
                },
                new StackedColumnSeries
                {
                    Title = "Good Parts",
                    Values = HourCounts,
                    DataLabels = true,
                    Fill = Brushes.Green,
                    FontSize = _machVM.MainVM.Scaler.ReportHeadFontSize,
                    UseLayoutRounding = false
                },
                new StackedColumnSeries
                {
                    Title = "Scrap Parts",
                    Values = HourScraps,
                    DataLabels = true,
                    Fill = Brushes.Red,
                    FontSize = _machVM.MainVM.Scaler.ReportHeadFontSize,
                    UseLayoutRounding = false
                }
            };
        }
        else
        {
            SeriesHoursCollection = new SeriesCollection();
        }

        HoursLabels = val => val.ToString("P");
}

Я хочу видеть 4 графика на экране, и когда я добавляю счет к машине, график этой машины обновляется, чтобы отразить это дополнение. Сейчас происходит сбой программы.

Все это отлично работает на одной диаграмме, в среде с одним компьютером.

...