views:

55

answers:

1

I am creating a BubbleSeries in a function within CS file. As a data source I use a List<Dictionary<string,string>> GridData, Unfortunately my implementation throws an exception: No suitable axis is available for plotting the dependent value. I am SL4 newbie and I can not figure out what could be a reson. Here is how I create and add BubbleSeries to Chart:

 List<Dictionary<string,string>> GridData = getGridData();

  var s1   = new BubbleSeries();
  s1.DependentValueBinding = new Binding("[" + <key to numeric value in DataGrid> + "]");
  s1.SizeValueBinding = new Binding("[" + <key to numeric value in DataGrid> + "]");
  s1.IndependentValueBinding = new Binding("[" + <key to string value in DataGrid> + "]");
  s1.ItemsSource = GridData;
  s1.Title = "Chart";
  // add BubbleSeries to Chart
  ChartVis.Series.Add(s1);

Here is a full description of an error I got in runtime:

Webpage error details

User Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)
Timestamp: Mon, 20 Sep 2010 07:09:33 UTC


Message: Unhandled Error in Silverlight Application 
Code: 4004    
Category: ManagedRuntimeError       
Message: System.InvalidOperationException: No suitable axis is available for plotting the dependent value.
   at System.Windows.Controls.DataVisualization.Charting.BubbleSeries.<>c__DisplayClass6.<GetAxes>b__3()
   at System.Windows.Controls.DataVisualization.Charting.DataPointSeriesWithAxes.GetAxes(DataPoint firstDataPoint, Func`2 independentAxisPredicate, Func`1 independentAxisFactory, Func`2 dependentAxisPredicate, Func`1 dependentAxisFactory)
   at System.Windows.Controls.DataVisualization.Charting.BubbleSeries.GetAxes(DataPoint firstDataPoint)
   at System.Windows.Controls.DataVisualization.Charting.DataPointSeriesWithAxes.GetAxes()
   at System.Windows.Controls.DataVisualization.Charting.DataPointSeriesWithAxes.OnDataPointsChanged(IList`1 newDataPoints, IList`1 oldDataPoints)
   at System.Windows.Controls.DataVisualization.Charting.DataPointSingleSeriesWithAxes.OnDataPointsChanged(IList`1 newDataPoints, IList`1 oldDataPoints)
   at System.Windows.Controls.DataVisualization.Charting.DataPointSeries.LoadDataPoints(IEnumerable newItems, IEnumerable oldItems)
   at System.Windows.Controls.DataVisualization.Charting.DataPointSeries.Refresh()
   at System.Windows.Controls.DataVisualization.Charting.DataPointSeries.OnSizeChanged(Object sender, SizeChangedEventArgs e)
   at System.Windows.FrameworkElement.OnSizeChanged(Object sender, SizeChangedEventArgs e)
   at MS.Internal.JoltHelper.RaiseEvent(IntPtr target, UInt32 eventId, IntPtr coreEventArgs, UInt32 eventArgsTypeIndex)     

Line: 56
Char: 13
Code: 0
URI: http://localhost:49402/MyTestPage.aspx

My chart implementation is:

  <toolkit:Chart Title="Visaulization" Grid.Column="0" x:Name="ChartVis">
                <toolkit:Chart.Series>
                </toolkit:Chart.Series>
 </toolkit:Chart>

UPDATE: After changing the declaration of my dictionary to Dictionary<string,object>, and putting numeric values as doubles. I got this error:

Message: Unhandled Error in Silverlight Application 
Code: 4004    
Category: ManagedRuntimeError       
Message: System.InvalidOperationException: Assigned dependent axis cannot be used. This may be due to an unset Orientation property for the axis or a type mismatch between the values being plotted and those supported by the axis.
   at System.Windows.Controls.DataVisualization.Charting.DataPointSeriesWithAxes.GetAxes(DataPoint firstDataPoint, Func`2 independentAxisPredicate, Func`1 independentAxisFactory, Func`2 dependentAxisPredicate, Func`1 dependentAxisFactory)
   at System.Windows.Controls.DataVisualization.Charting.BubbleSeries.GetAxes(DataPoint firstDataPoint)
   at System.Windows.Controls.DataVisualization.Charting.DataPointSeriesWithAxes.GetAxes()
   at System.Windows.Controls.DataVisualization.Charting.DataPointSeriesWithAxes.OnDataPointsChanged(IList`1 newDataPoints, IList`1 oldDataPoints)
   at System.Windows.Controls.DataVisualization.Charting.DataPointSingleSeriesWithAxes.OnDataPointsChanged(IList`1 newDataPoints, IList`1 oldDataPoints)
   at System.Windows.Controls.DataVisualization.Charting.DataPointSeries.LoadDataPoints(IEnumerable newItems, IEnumerable oldItems)
   at System.Windows.Controls.DataVisualization.Charting.DataPointSeries.Refresh()
   at System.Windows.Controls.DataVisualization.Charting.DataPointSeries.OnSizeChanged(Object sender, SizeChangedEventArgs e)
   at System.Windows.FrameworkElement.OnSizeChanged(Object sender, SizeChangedEventArgs e)
   at MS.Internal.JoltHelper.RaiseEvent(IntPtr target, UInt32 eventId, IntPtr coreEventArgs, UInt32 eventArgsTypeIndex)     
A: 

Modify getGridData to return List<Dictionary<string, object>> and ensure the numeric values are added the dictionary using a numeric type such as int or double.

Edit

It may be easier to use a concrete example, here is some test code:-

public partial class BubbleTest : UserControl
{
    public BubbleTest()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(BubbleTest_Loaded);
    }

    void BubbleTest_Loaded(object sender, RoutedEventArgs e)
    {
        var s1   = new BubbleSeries(); 
        s1.DependentValueBinding = new Binding("[dependent]"); 
        s1.SizeValueBinding = new Binding("[size]"); 
        s1.IndependentValueBinding = new Binding("[independent]"); 
        s1.ItemsSource = GetGridData(); 
        s1.Title = "Chart";
        ChartVis.Series.Add(s1);

    }

    private List<Dictionary<string, object>> GetGridData()
    {
        List<Dictionary<string, object>> gridData = new List<Dictionary<string, object>>();

        gridData.Add(CreateBubbleEntry("First", 10.0, 5.0));
        gridData.Add(CreateBubbleEntry("Second", 20.0, 10.0));

        return gridData;
    }

    private Dictionary<string, object> CreateBubbleEntry(string independent, double dependent, double size)
    {
        var item = new Dictionary<string, object>();
        item.Add("independent", independent);
        item.Add("dependent", dependent);
        item.Add("size", size);
        return item;
    }
}

The Xaml for this user control is as you have it:-

<UserControl x:Class="SilverlightApplication1.BubbleTest"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"
>   
    <Grid x:Name="LayoutRoot" Background="White">
        <toolkit:Chart Title="Visaulization" Grid.Column="0" x:Name="ChartVis">
            <toolkit:Chart.Series>
            </toolkit:Chart.Series>
        </toolkit:Chart>
    </Grid>
</UserControl>

The above works so whatever you are actually doing will vary in some way.

AnthonyWJones
I did as you suggested but I get still an error. This time I get System.InvalidOperationException: Message: Unhandled Error in Silverlight Application Code: 4004 Category: ManagedRuntimeError Message: System.InvalidOperationException: Assigned dependent axis cannot be used. This may be due to an unset Orientation property for the axis or a type mismatch between the values being plotted and those supported by the axis. at System.Windows.Controls.DataVisualization.Charting.DataPointSeriesWi
Skarab