【问题标题】:Looping through colors in binding在绑定中循环颜色
【发布时间】:2015-11-16 18:45:00
【问题描述】:

我正在处理一个由其他人编写的大型代码项目,因此我正在尝试添加一个影响尽可能小的更改。它使用System.Windows.Controls.DataVisualization.Toolkit 创建一个线图,将多个LineSeries 合并为一个MultiChart,这是我的前任自己创建的一个类。

线条都是相同的颜色。我被要求为它们制作不同的颜色。或者真的不止一种颜色。行数不是恒定的,所以我希望循环遍历颜色列表。那么我所要做的就是制作一个足够大以覆盖大多数情况的文件。

由于行号不一致,我无法明确定义每种颜色。此外,MultiChart 有一个SeriesSource 属性,它是多个LineSeriesObservableCollection,而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 属性。请注意,chart 是 MultiChart 对象的名称。

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

            }
        }
    }

但我收到错误,该行没有公共 GetEnumerator。

有什么建议吗?

【问题讨论】:

  • 这是 wpf 工具包吧?它不支持将Palette 依赖属性设置为StaticResource 并分配类似于this 的颜色吗?自从我用它喝了一段时间以来,所以我可能是错的。
  • 我用Palette 尝试了许多选项。问题是我需要为MultiChart 提供一个Palette,它没有该属性。它是图表的集合。而且我无法想象创建该属性会很容易,而且我在创建依赖属性时度过了一段糟糕的时光。我不知道从哪里开始。

标签: c# wpf xaml mvvm datavisualization.toolkit


【解决方案1】:

好吧,看起来写这个问题让我的创意源源不断。我记得我试图在后面的代码中设置样式设置器,但是您无法在加载时修改样式。但我才意识到我可以随时切换风格。所以我做了这些:

<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。原来我不需要绑定(可能是我能够想出它的原因)。但我仍然对其他想法感兴趣。我想要一个合适的绑定示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 2015-05-06
    • 2018-09-02
    • 1970-01-01
    • 2015-11-08
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多