2015-11-16 83 views
0

我正在研究一个由其他人编写的大型代码项目,因此我试图用尽可能小的影响添加更改。它使用System.Windows.Controls.DataVisualization.Toolkit创建一个LineSeries合并为一个MultiChart的折线图,这是我的前任创建的一个类。在绑定中循环遍历颜色

这些线条都是相同的颜色。我被要求让他们有不同的颜色。或者真的有不止一种颜色。行数不是恒定的,所以我希望循环显示一系列颜色。那么我所要做的就是创造一个足够大的覆盖大多数案例。

由于行号不一致,我无法明确定义每种颜色。此外,MultiChart具有SeriesSource属性,该属性是多个LineSeriesObservableCollection,其依次是数据点的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值,这是与视图相关的信息。糟糕的MVVM,但我只是试图让它适应模式之前工作。

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

我试着在转换器返回之前只做((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工具包的权利?它不支持将Palette的依赖项属性设置为StaticResource并指定颜色类似[this](http://stackoverflow.com/questions/3703301/changing-default-colors-of-wpftoolkit-chart -控制)?过了一段时间,因为我已经与它d so,所以我可能是错的。 –

+0

我已经尝试了一些选项与调色板。问题是我需要为'MultiChart'有一个'Palette',它没有那个属性。这是一个图表集合。而且我无法想象创建这个属性会很容易,而且我有一段糟糕的时间来制作依赖属性。我不知道从哪开始。 – 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。原来我不需要绑定(可能为什么我能够拿出它)。但我仍然对其他想法感兴趣。我想要一个适当的绑定示例。