Я работаю над проектом большого кода, который был написан кем-то другим, поэтому я пытаюсь добавить изменения с минимальным воздействием. Он использует System.Windows.Controls.DataVisualization.Toolkit
, чтобы создать линейную диаграмму с числом LineSeries
, объединенным в один MultiChart
, который является моим предшественником.Зацикливание цветов в привязке
Линии одного цвета. Меня попросили сделать их разными цветами. Или более одного цвета. Количество строк не является постоянным, поэтому я надеялся пройти через список цветов. Тогда все, что мне нужно сделать, это сделать достаточно большим, чтобы охватить большинство случаев.
Из-за несогласованности номера строки я не могу однозначно определить каждый цвет. Кроме того, MultiChart
имеет свойство SeriesSource
, которое представляет собой ObservableCollection
нескольких LineSeries
, которое, в свою очередь, представляет собой ObservableCollection
точек данных, которое устанавливается посредством привязки к ViewModel.
Так что, я думаю, мне придется привязать цвет к значению за пределами xaml. Поскольку это связанная с просмотром работа, я полагаю, что код позади был бы правильным местом для моего изменения цвета, но я не смог найти решение, которое там работает.
Я рассмотрел ряд вопросов о SO и в других местах, и никто из них не работал, с учетом или без рассмотрения шаблона MVVM. Я просто ищу рабочее решение, которое я могу переработать в MVVM, но бонусные баллы, если это хорошая практика.
Я работаю с WPF какое-то время, и по какой-то причине я не могу полностью обмануть привязку данных, что, скорее всего, я не увенчался успехом большинства решений, которые я нашел. Несмотря на то что я думаю, что я был рядом с этим:
В <UserControl.Resources>
<local:LocalColorConverter x:Key="MyColorConverter"/>
<Style x:Key="dataPointStyle" TargetType="{x:Type charting:LineDataPoint}">
<Setter Property="Background" Value="{Binding Path=DataContext.ColorCount,
RelativeSource={RelativeSource AncestorType=local:MultiChart, Mode=FindAncestor},
Converter={StaticResource MyColorConverter}}"/>
</Style>
В LocalColorConverter.cs
:
class LocalColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int count = (int)value;
//SolidColorBrush returnBrush = new SolidColorBrush();
SolidColorBrush color = new SolidColorBrush();
switch (count % 5)
{
case 0:
color.Color = Colors.Blue;
break;
case 1:
color.Color = Colors.Green;
break;
case 2:
color.Color = Colors.Red;
break;
case 3:
color.Color = Colors.Purple;
break;
case 4:
color.Color = Colors.Yellow;
break;
}
return color;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Я понимаю, что это не очень хорошо на практике. Он полагается на значение ColorCount из viewmodel, которое является информацией, относящейся к представлению. Bad MVVM, но я просто пытаюсь заставить его работать, прежде чем я подгоню шаблон.
Кроме того, на самом деле это не так, поскольку ColorCount
не изменяется. Он первоначально установлен в 0 в режиме просмотра. Если бы я продолжил этот путь, я хотел бы увеличить значение ColorCount, чтобы цвета менялись каждый раз, когда используется конвертер.
Я пытался сделать только ((int)value)++
, прежде чем конвертер вернется, но это не сработало. Я не думал, что это будет, но это дает вам представление о том, что я ищу.
В противном случае, я считаю, что лучшим решением является выполнение этой операции в коде позади. Но я не знаю, где и как это сделать. Он должен будет изменить цвет, когда UserControl
получит новый LineSeries
. В текущем коде есть обработчик события LineSeries_Loaded
, но цвет не задан в строке, он задан для каждой точки в строке. Поэтому мне нужно увеличить свой счетчик цветов в каждой строке, а затем использовать счет в каждой точке, чтобы определить его цвет.
Я пробовал это, но я не могу найти свойство фона таким образом. Обратите внимание, что диаграмма - это имя, присвоенное объекту MultiChart
.
private void LineSeries_Loaded(object sender, RoutedEventArgs e)
{
foreach(LineSeries line in chart.Series.Cast<LineSeries>())
{
foreach(LineDataPoint point in line)
{
}
}
}
Но я получаю сообщение об ошибке, что в строке нет публичного GetEnumerator.
Любые предложения?
Это инструментарий wpf справа? Не поддерживает ли она настройку свойства зависимостей «Палитра» на StaticResource и назначает цвета вроде [этого] (http://stackoverflow.com/questions/3703301/changing-default-colors-of-wpftoolkit-chart -контроль)? Некоторое время назад, когда я потрогал его, я, возможно, ошибаюсь. –
Я попробовал несколько опций с помощью 'Palette'. Проблема в том, что мне нужно иметь «Палитру» для 'MultiChart', которая не имеет этого свойства. Это набор диаграмм. И я не могу себе представить, что создание этого свойства было бы легким, и у меня было ужасное время, создающее свойства зависимостей. Я не знаю, с чего начать. – MichaelN