2015-11-16 135 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。原來我不需要綁定(可能爲什麼我能夠拿出它)。但我仍然對其他想法感興趣。我想要一個適當的綁定示例。