在装订中循环使用颜色

时间:2015-11-16 18:45:00

标签: c# wpf xaml mvvm datavisualization.toolkit

我正在开发一个由其他人编写的大型代码项目,所以我试图尽可能少地添加更改。它使用System.Windows.Controls.DataVisualization.Toolkit创建一个线条图,其中LineSeries合并为一个MultiChart,这是我的前任自己创建的一个类。

线条颜色相同。我被要求让它们变成不同的颜色。或者真的不止一种颜色。行数不是常数,所以我希望循环遍历一系列颜色。然后我所要做的就是做一个大到足以覆盖大多数情况。

由于行号不一致,我无法明确定义每种颜色。此外,MultiChart有一个SeriesSource属性,它是多个ObservableCollection的{​​{1}},而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();
    }
}

我意识到这在实践中并不是很好。它依赖于viewmodel中的ColorCount值,该值是与视图相关的信息。糟糕的MVVM,但我只是想让它适应模式之前让它工作。

此外,它并不真正有效,因为ColorCount永远不会改变。它最初在viewmodel中设置为0。如果我继续沿着这条路走下去,我想增加ColorCount的值,以便每次使用Converter时颜色都会改变。

我在转换器返回之前尝试执行((int)value)++,但这不起作用。我不认为它会,但它让你知道我在寻找什么。

否则,我认为我最好的解决方案是在后面的代码中执行此操作。但我不知道在哪里/怎么做。当UserControl到达新LineSeries时,必须更改颜色。后面的当前代码实现了LineSeries_Loaded事件处理程序,但颜色未在行中设置,它是为行中的每个点设置的。所以我需要在每一行增加我的颜色计数器,然后使用每个点的计数来确定它的颜色。

我试过这个,但我似乎无法通过这种方式找到Background属性。请注意,图表是MultiChart对象的名称。

private void LineSeries_Loaded(object sender, RoutedEventArgs e)
    {
        foreach(LineSeries line in chart.Series.Cast<LineSeries>())
        {
            foreach(LineDataPoint point in line)
            {

            }
        }
    }

但我得到的错误是该行没有公开的GetEnumerator。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

好吧,看起来像写问题让我的创意果汁流淌。我记得我试图在后面的代码中设置样式设置器,但是你无法在加载时修改样式。但我刚刚意识到我可以随时切换样式。所以我做了这些:

i

然后,在后面的代码中:

j

它正在工作!好吧,大多数情况下,每隔一行被分成一个,所以我还有一些工作要做。但这就是我问的答案。而且它似乎适合MVVM。结果我不需要绑定(可能为什么我能想出它)。但我仍然对其他想法感兴趣。我想要一个合适的绑定示例。