Инфраструктура XamWebChart Серия Fill Color Binding - PullRequest
1 голос
/ 23 марта 2011

У меня есть ControlTemplate , который содержит XamWebChart .Для каждого кругового фрагмента, созданного в моей серии, я хотел бы, чтобы его цвет заливки был привязан к одному и тому же источнику, откуда берутся значение и метка.

Текущий xaml для моей круговой диаграммы выглядит следующим образом:

<ControlTemplate x:Key="DataLocation">
 <Viewbox 
 Width="{TemplateBinding Width}" 
 Height="{TemplateBinding Height}"                
 Stretch="Fill">
 <Grid>
 <Grid.Resources>
 <Style x:Key="PieChartSeriesStyle" TargetType="Chart:Series">
  <Setter Property="Stroke" Value="#00FFFFFF" />                            
  <Setter Property="Marker">
    <Setter.Value>
     <Chart:Marker Foreground="#FFFFFFFF" />
    </Setter.Value>
  </Setter>
  </Style>
</Grid.Resources>
<Chart:XamWebChart x:Name="PieChart" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
  <Chart:XamWebChart.Scene>
   <Chart:Scene>
    <Chart:Scene.GridArea>
      <Chart:GridArea BorderThickness="0" Background="#00FFFFFF" />
    </Chart:Scene.GridArea>
    </Chart:Scene>
   </Chart:XamWebChart.Scene>

<Chart:XamWebChart.Series>
  <Chart:Series 
   ChartType="Pie" 
   Style="{StaticResource PieChartSeriesStyle}" 
   DataMapping="Value=Amount;Label=Identifier"                                
   DataSource="{Binding Path=ToolTip.Details}" 
    Fill="{Binding DetailItem.ColorProvider.BackgroundColor}">
  </Chart:Series>                                   
</Chart:XamWebChart.Series>                        
</Chart:XamWebChart>
</Grid>
</Viewbox>
</ControlTemplate>

Объектами, привязанными к этому ControlTemplate, являются:

public sealed class GeographyDataItem{
        public IEnumerable<GeographyDataDetailItem> Details
        {
            get { return _details; }
        }

}

С потомками:

public sealed class GeographyDataDetailItem
    {
        private readonly IColorProvider _colorProvider;

        public IColorProvider ColorProvider
        {
            get { return _colorProvider; }
        }

        public string Identifier { get;  private set; }
        public double Amount { get; private set; }

        public GeographyDataDetailItem(string identifier, double amount, IColorProvider colorProvider)
        {
            _colorProvider = colorProvider;
            Identifier = identifier;
            Amount = amount;
        }        
    }

Где IColorProvider:

public interface IColorProvider
{
    Color ForegroundColor { get; }
    Color BackgroundColor { get; }
}

Привязка ControlTemplateустановлено привязывание к элементам GeographyDataItem .

Единственная проблема, с которой я сталкиваюсь, - это привязка ForegroundColor свойства GeographyDataDetailItem . IColorProvider до свойства Fill ряда данных Pie.Я не уверен, как идти об этом.

1 Ответ

2 голосов
/ 23 марта 2011

Мне не удалось достичь того, чего я хотел в XAML, но я смог поддержать этот вариант использования в контрольном коде позади.

Мое решение:

...
<Chart:XamWebChart.Series>
 <Chart:Series ChartType="Pie"
   Style="{StaticResource PieChartSeriesStyle}"
   DataMapping="Value=Amount;Label=Identifier"
   DataSource="{Binding Path=ToolTip.Details}" 
   Loaded="SeriesLoaded" /> 
<!-- Loaded Event Added !-->
...

И код beind:

  private void SeriesLoaded(object sender, RoutedEventArgs e)
    {
        var series = (Series) sender;
        ColorDataPointSeries(series);
    }

    /// <summary>
    /// Colors in <see cref="DataPoint"/> from the bound DataSource for the pie chart layer control.
    /// </summary>
    /// <param name="series"></param>
    private static void ColorDataPointSeries(Series series)
    {
        //If nothing is bound there is nothing to do.
        if (null == series.DataSource)
            return;

        var dataSource = ((IEnumerable<GeographyDataDetailItem>) series.DataSource).ToList();
        var dataPoints = series.DataPoints;

        //Note, I am depending on the control to have the exact number of dataPoints as dataSource elements here.
        for (var sourceIndex = 0; sourceIndex < dataSource.Count(); sourceIndex++)
        {
            //Iterate through each dataSoruce, looking for a color provider.
            //If one exists, change the Fill property of the control DataPoint.
            var colorProvider = dataSource[sourceIndex].ColorProvider;
            if (null != colorProvider)
                dataPoints[sourceIndex].Fill = new SolidColorBrush(colorProvider.BackgroundColor);
        }
    }            

Итак, теперь каждый раз, когда XamWebChart загружается для рендеринга, цвет заливки применяется из источника данных.Привязка к прослушиванию изменений свойств не обязательна, так как я не ожидаю, что цвет меняется после рендеринга.

Было бы неплохо узнать альтернативу, чтобы иметь это в XAML, чтобы уменьшить этот код;однако на данный момент это решило мою проблему.

...