为什么数据绑定我的图表系列颜色失败?

时间:2012-12-09 22:35:43

标签: wpf data-binding charts .net-4.5 wpftoolkit

我正在使用WPF工具包绘制简单的折线图。我的目标是通过数据绑定设置我的系列的线条颜色。这只能成功部分。问题是:为什么?

设置

命名空间:

xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" x:Class="WpfApplication3.MainWindow"
xmlns:media="clr-namespace:System.Windows.Media;assembly=PresentationCore"

图表:

<chartingToolkit:Chart x:Name="chart">
    <chartingToolkit:LineSeries x:Name="seriesEntries" IndependentValueBinding="{Binding Key}" DependentValueBinding="{Binding Value}" DataPointStyle="{StaticResource CommonLineSeriesDataPoint}">
        <chartingToolkit:LineSeries.Tag>
            <media:Brush>Green</media:Brush>
        </chartingToolkit:LineSeries.Tag>
    </chartingToolkit:LineSeries>
</chartingToolkit:Chart>

暂时忽略Tag,稍后会相关。

请注意,图表具有自定义数据点样式CommonLineSeriesDataPoint

<Style x:Key="CommonLineSeriesDataPoint" TargetType="chartingToolkit:LineDataPoint">
    <Setter Property="Background">
        <Setter.Value>
            <media:Brush>Red</media:Brush>
        </Setter.Value>
    </Setter>
</Style>
<Style TargetType="chartingToolkit:LineSeries">
    <Setter Property="DataPointStyle" Value="{StaticResource CommonLineSeriesDataPoint}" />
</Style>

正如预期的那样,这会为我的系列红色

着色

Red line series

突破变化

现在我想数据绑定我的数据点背景。我只做了一次改变。我没有直接指定背景画笔,而是将其绑定到我的Tag的{​​{1}}属性,这也是一个画笔(参见上一个LineSeries声明,它是绿色一)。

LineSeries

结果如下:

enter image description here

所以点是绿色的。 但是这条线已经消失了

我的期望是看到一条绿线!它在哪里?

1 个答案:

答案 0 :(得分:0)

我在挖掘WPF工具包源代码后找到了解决方案。

通过StrokePolyline系列的Background属性绑定到TemplateBinding属性。我怀疑这与我绑定Background属性本身的尝试不相符。

SO上的{p> This answer表示在编译时评估TemplateBinding。因此,让我们摆脱TemplateBinding并将Stroke属性直接绑定到Tag的{​​{1}}(请记住:LineSeries包含绿色刷)。

从WPF工具包源 \ Source \ DataVisualization \ Themes \ generic.xaml 我复制了Tag的部分样式定义并将其添加到我的LineSeries

ResourceDictionary

(如果有兴趣,您可以在 generic.xaml 中搜索<Style x:Key="CommonLineSeries" TargetType="chartingToolkit:LineSeries" BasedOn="{StaticResource {x:Type chartingToolkit:LineSeries}}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="chartingToolkit:LineSeries"> <Canvas x:Name="PlotArea"> <Polyline Points="{TemplateBinding Points}" Stroke="{Binding Tag, RelativeSource={RelativeSource AncestorType={x:Type chartingToolkit:LineSeries}}}" Style="{TemplateBinding PolylineStyle}"/> </Canvas> </ControlTemplate> </Setter.Value> </Setter> </Style> ,以查找我从中复制的来源。)

我修改的唯一内容是<!-- charting:LineSeries -->的绑定。在这里,我使用与数据点相同的绑定。

最后要做的事情:告诉Stroke使用这种风格:

LineSeries

瞧,它有效。线路又回来了,它是绿色的:

Diagram - Line Color Fixed

(如果你仔细观察,你会看到该系列的图例条目仍然有错误的颜色。但我认为解决方案与上面的相似。)