Динамическое изменение цвета диаграммы в WPF с использованием MVVM и привязки данных - PullRequest
1 голос
/ 08 ноября 2011

Я пытаюсь построить диаграмму с колонками. Столбцы будут иметь разные цвета по значению. Я использую MVVM с WPF и привязкой данных. Как я пытаюсь сделать (в моей ViewModel):

 private Int16 colorValue;
    public Int16 ColorValue
    {
        get { return colorValue; }
        set
        {
            colorValue = value;
            if (ColorValue < 20)
                ColorType = new SolidColorBrush { Color = Colors.Aqua };
            if (ColorValue < 40)
                ColorType = new SolidColorBrush { Color = Colors.Gray };
            if (ColorValue >= 41)
                ColorType = new SolidColorBrush { Color = Colors.Black };
        }
    }
    private Brush colorType;
    public Brush ColorType
    {
        get { return colorType; }
        set
        {
            if (value != null)
            {
                colorType = value;
                OnPropertyChanged("ColorType");
            }
        }
    }

Into Xaml (это статический ресурс для изменения атрибута цвета столбца):

 <Style x:Key="ColorByGradeColumn" TargetType="DVC:ColumnDataPoint">
        <Setter Property="Background" Value="DarkGray"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate
            TargetType="DVC:ColumnDataPoint">
                    <Border
                BorderBrush="{TemplateBinding BorderBrush}"
                BorderThickness="{TemplateBinding BorderThickness}">
                        <Grid Background="{Binding ColorType}">
                            <Rectangle>
                                <Rectangle.Fill>
                                    <LinearGradientBrush>
                                        <GradientStop Color="#77ffffff" Offset="0"/>
                                        <GradientStop Color="#00ffffff" Offset="1"/>
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                            <Border BorderBrush="#ccffffff" BorderThickness="1">
                                <Border BorderBrush="#77ffffff" BorderThickness="1"/>
                            </Border>
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Мой график в Xaml:

<Grid Grid.Column="2" Height="368" HorizontalAlignment="Left" Name="grid1" VerticalAlignment="Bottom" Width="1009" Grid.ColumnSpan="4" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="198*" />
            <ColumnDefinition Width="191*" />
        </Grid.ColumnDefinitions>
        <DVC:Chart x:Name="ColumnChart"
           Grid.ColumnSpan="2">
            <DVC:ColumnSeries
                AnimationSequence="FirstToLast"
                FlowDirection="LeftToRight"
                Title="Largura"
                ItemsSource="{Binding Path=Placas, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                ToolTip="{Binding Path=Slab.InfThick}"
                DependentValueBinding="{Binding Path=Slab.InfThick}"
                IndependentValueBinding="{Binding Path=Slab.SlabId}"
                DataPointStyle="{StaticResource ColorByGradeColumn}">
            </DVC:ColumnSeries>
        </DVC:Chart>
    </Grid>

Итак ... Моя диаграмма с использованием ColumnSeries получает свой атрибут по статическому ресурсу, определенному в DataPointStyle. StaticResource 'ColorByGradeColumn' Я сделал привязку к своему свойству ColorType. Вот вопрос ... Почему не работает? Я выполнил шаги, описанные в этой ссылке:

Столбцы другого цвета [Настройка внешнего вида диаграмм Silverlight с повторными шаблонами и MVVM]

И я действительно не знаю, чего мне не хватает.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2011

Хорошо, мы выяснили, как исправить эту раздражающую вещь:

Мы создали конвертер, который получит значение и вернет цвет, который мы хотели.Раньше я пытался сделать со свойством:

  #region Converters
/// <summary>
/// Retorna a cor do estado da placa
/// </summary>
public class RetornaCorEstadoBarra : DependencyObject, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        try
        {
            var ColorValue = (Int32)value;
            if (ColorValue < 800)
                return "Aqua";
            else if (ColorValue < 1000)
                return "Gray";
            else //if (ColorValue > 1001)
                return "Black";
        }
        catch
        {
            return "Black";
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
#endregion

Создание ресурса внутри xaml-файла:

<vm:RetornaCorEstadoBarra x:Key="RetornaCorEstadoBarra" />

И создание стиля чуть ниже этого ресурса:

<Style x:Key="ColorByGradeColumn" TargetType="DVC:ColumnDataPoint">
        <Setter Property="Template" >
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DVC:ColumnDataPoint}">
                    <Border
                         BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"
                         Background="{Binding Slab.InfThick,Converter={StaticResource RetornaCorEstadoBarra}}"
                         >
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Хорошо, теперь подвох:

 <DVC:Chart x:Name="ColumnChart" Grid.ColumnSpan="2" Width="{Binding Path=GridWidthSize}" >
                <DVC:ColumnSeries 
                AnimationSequence="FirstToLast" FlowDirection="LeftToRight" Title="Largura" ItemsSource="{Binding Path=Placas, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                ToolTip="{Binding Path=Slab.SlabId}" DependentValueBinding="{Binding Path=Slab.InfThick}" IndependentValueBinding="{Binding Path=Slab.SlabId}"
                    DataPointStyle="{StaticResource ColorByGradeColumn}">
                    <DVC:ColumnSeries.IndependentAxis>
                        <DVC:CategoryAxis Orientation="X" Visibility="Visible" Foreground="Transparent"/>
                    </DVC:ColumnSeries.IndependentAxis>
                </DVC:ColumnSeries>
             </DVC:Chart>
        </ScrollViewer>

Ну, проблема в том, что цвет на графике - это статический ресурс.Это не меняется во второй раз.Итак, с «импровизированным» динамическим ресурсом проблема исправлена, вот здесь:

Background="{Binding Slab.InfThick,Converter={StaticResource RetornaCorEstadoBarra}}"

Мы передаем параметр этому конвертеру RetornaCorEstadoBarra.Он получит параметр и вернет значение цвета.Затем внутри моей Диаграммы, чем Связывает с моим ресурсом, будет заполнена Диаграмма значением, полученным моим Конвертером.Но Диаграмма получает значение только один раз.Тем не менее, мой конвертер всегда будет возвращать значение, когда он получает значение.Вот в чем подвох.

Спасибо за помощь:)

0 голосов
/ 08 ноября 2011

Может быть, я неправильно понимаю, но разве вы не покрываете цвет фона сетки фиксированной градиентной заливкой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...