2015-11-16 4 views
0

Я работаю над проектом большого кода, который был написан кем-то другим, поэтому я пытаюсь добавить изменения с минимальным воздействием. Он использует 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.

Любые предложения?

+0

Это инструментарий wpf справа? Не поддерживает ли она настройку свойства зависимостей «Палитра» на StaticResource и назначает цвета вроде [этого] (http://stackoverflow.com/questions/3703301/changing-default-colors-of-wpftoolkit-chart -контроль)? Некоторое время назад, когда я потрогал его, я, возможно, ошибаюсь. –

+0

Я попробовал несколько опций с помощью 'Palette'. Проблема в том, что мне нужно иметь «Палитру» для 'MultiChart', которая не имеет этого свойства. Это набор диаграмм. И я не могу себе представить, что создание этого свойства было бы легким, и у меня было ужасное время, создающее свойства зависимостей. Я не знаю, с чего начать. – MichaelN

ответ

0

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

<Style x:Key="blueDataPointStyle" TargetType="{x:Type charting:LineDataPoint}" BasedOn="{StaticResource dataPointStyle}"> 
    <Setter Property="Background" Value="Blue"/> 
</Style> 

<Style x:Key="redDataPointStyle" TargetType="{x:Type charting:LineDataPoint}" BasedOn="{StaticResource dataPointStyle}"> 
    <Setter Property="Background" Value="Red"/> 
</Style> 

<Style x:Key="greenDataPointStyle" TargetType="{x:Type charting:LineDataPoint}" BasedOn="{StaticResource dataPointStyle}"> 
    <Setter Property="Background" Value="Green"/> 
</Style> 

Затем в коде позади:

private void UserControl_Loaded(object sender, RoutedEventArgs e) 
    { 
     int count = 0; 
     foreach (LineSeries line in chart.Series) 
     { 
      switch (count % 3) 
      { 
       case 0: 
        line.DataPointStyle = Resources["blueDataPointStyle"] as Style; 
        break; 
       case 1: 
        line.DataPointStyle = Resources["redDataPointStyle"] as Style; 
        break; 
       case 2: 
        line.DataPointStyle = Resources["greenDataPointStyle"] as Style; 
        break; 
      } 
      count++; 

     } 
    } 

Это работает! Ну, в основном, получается, что каждая другая строка сгруппирована в одну, поэтому мне еще предстоит кое-что сделать. Но это ответ за то, что я спросил. Плюс это похоже на MVVM. Оказывается, мне не нужна привязка (возможно, почему я смог это придумать). Но меня все еще интересуют другие идеи. Я бы хотел, чтобы был правильный пример привязки.

 Смежные вопросы

  • Нет связанных вопросов^_^