我正在处理一个由其他人编写的大型代码项目,因此我正在尝试添加一个影响尽可能小的更改。它用于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 值,这是与视图相关的信息。糟糕的 MVVM,但我只是想在让它适合模式之前让它工作。
此外,它并没有真正按原样工作,因为ColorCount
它永远不会改变。它最初在视图模型中设置为 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 的错误。
有什么建议么?