1

I have a WPF Chart that I am dynamically binding a BarSeries to. I would like to have the BarSeries show 3 pieces of information, however. The third piece of information I would like to be shown in the tooltip of any given datapoint.

Is there any way to dynamically bind the value/content of the tooltip for a given datapoint in my barseries??

XAML:

<UserControl.Resources>
    <Style
       x:Key="SimpleDataPointStyle"
       BasedOn="{StaticResource {x:Type chartingToolkit:BarDataPoint}}"
       TargetType="{x:Type chartingToolkit:BarDataPoint}">
        <Setter Property="Width" Value="20"/>
        <Setter Property="Height" Value="20"/>
        <Setter x:Name="DataPointToolTip" Property="ToolTip" Value="{Binding Path=Event_Description}"/>
    </Style>
</UserControl.Resources>
<Grid x:Name="MetricsPanel" Width="904" Height="376" HorizontalAlignment="Left" VerticalAlignment="Top">   
    <chartingToolkit:Chart x:Name="MetricChart" HorizontalAlignment="Left" Width="464" Height="352" VerticalAlignment="Top">
        <chartingToolkit:Chart.Series>
            <chartingToolkit:BarSeries x:Name="MainSeries"
                                       Title="Contribution to Risk and Errors (%)"
                                       IndependentValueBinding="{Binding}"
                                       DependentValueBinding="{Binding}">
                <chartingToolkit:BarSeries.DataPointStyle>
                    <Style
                        BasedOn="{StaticResource SimpleDataPointStyle}"
                        TargetType="{x:Type chartingToolkit:BarDataPoint}">  
                    </Style>
                </chartingToolkit:BarSeries.DataPointStyle>

            </chartingToolkit:BarSeries>
        </chartingToolkit:Chart.Series>
    </chartingToolkit:Chart>

Code-Behind

highestWeightedEvents = BuildHighestWeightedEventsTable();

        MainSeries.DependentValueBinding = new Binding("Cutset_Frequency");
        MainSeries.IndependentValueBinding = new Binding("Event_Number");
        MainSeries.ItemsSource = highestWeightedEvents.DefaultView;
        Style dataPointStyle = (Style)Resources["SimpleDataPointStyle"];
        MainSeries.DataPointStyle = dataPointStyle;

How can I specify the binding for the tooltip in code behind?

Thank in advance...

2 Answers 2

1

I actually solved my own problem last night by completely redefining the template for BarDataPoint.

Style XAML:

<Style x:Key="NewDataPointStyle" TargetType="chartingToolkit:BarDataPoint">
<Setter Property="Background" Value="SteelBlue" />
<Setter Property="IsTabStop" Value="False" />
<Setter Property="BorderBrush" Value="#FF686868" />
<Setter Property="Width" Value="20" />
<Setter Property="Height" Value="20" />
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="chartingToolkit:BarDataPoint">
            <Grid x:Name="Root" Opacity="1">
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="CommonStates">
                        <VisualStateGroup.Transitions>
                            <VisualTransition GeneratedDuration="0:0:0.1" />
                        </VisualStateGroup.Transitions>
                        <VisualState x:Name="Normal" />
                        <VisualState x:Name="MouseOver">
                            <Storyboard>
                                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="MouseOverHighlight" Storyboard.TargetProperty="(UIElement.Opacity)">
                                    <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0.3" />
                                </DoubleAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                    </VisualStateGroup>
                    <VisualStateGroup x:Name="SelectionStates">
                        <VisualStateGroup.Transitions>
                            <VisualTransition GeneratedDuration="0:0:0.1" />
                        </VisualStateGroup.Transitions>
                        <VisualState x:Name="Unselected" />
                        <VisualState x:Name="Selected">
                            <Storyboard>
                                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="SelectionHighlight" Storyboard.TargetProperty="(UIElement.Opacity)">
                                    <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0.185" />
                                </DoubleAnimationUsingKeyFrames>
                                <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="SelectionHighlight" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
                                    <SplineColorKeyFrame KeyTime="00:00:00" Value="#FF8A8A8A" />
                                </ColorAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                    </VisualStateGroup>
                    <VisualStateGroup x:Name="RevealStates">
                        <VisualStateGroup.Transitions>
                            <VisualTransition GeneratedDuration="0:0:0.5" />
                        </VisualStateGroup.Transitions>
                        <VisualState x:Name="Shown">
                            <Storyboard>
                                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="Root" Storyboard.TargetProperty="(UIElement.Opacity)">
                                    <SplineDoubleKeyFrame KeyTime="00:00:00" Value="1" />
                                </DoubleAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="Hidden">
                            <Storyboard>
                                <DoubleAnimation Duration="0" Storyboard.TargetName="Root" Storyboard.TargetProperty="Opacity" To="0" />
                            </Storyboard>
                        </VisualState>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
                <ToolTipService.ToolTip>
                    <ContentControl Content="{Binding Path=Event_Description}" />
                </ToolTipService.ToolTip>
                        <StackPanel Orientation="Horizontal"
                                Background="{TemplateBinding Background}">
                        </StackPanel>
                </Grid>
        </ControlTemplate>
    </Setter.Value>
</Setter>

Chart XAML:

<chartingToolkit:Chart x:Name="MetricChart" HorizontalAlignment="Left" Width="464" Height="352" VerticalAlignment="Top">
        <chartingToolkit:Chart.Axes>
            <chartingToolkit:LinearAxis Interval="10" Maximum="100" x:Name="XAxis" Orientation="X" Title="Percent Contribution (%)"/>
            <chartingToolkit:CategoryAxis Title="Event Number" Orientation="Y"/>
        </chartingToolkit:Chart.Axes>
        <chartingToolkit:Chart.Series>
            <chartingToolkit:BarSeries x:Name="MainSeries"
                                       Title="Contribution to Risk and Errors (%)"
                                       IndependentValueBinding="{Binding}"
                                       DependentValueBinding="{Binding}" BorderThickness="0" BorderBrush="Black" Background="Black" OpacityMask="Black">
                <chartingToolkit:BarSeries.DataPointStyle>
                    <Style
                        BasedOn="{StaticResource NewDataPointStyle}"
                        TargetType="{x:Type chartingToolkit:BarDataPoint}">
                    </Style>
                </chartingToolkit:BarSeries.DataPointStyle>
            </chartingToolkit:BarSeries>
        </chartingToolkit:Chart.Series>
        <chartingToolkit:Chart.LegendStyle>
            <Style TargetType="Control">
                <Setter Property="Width" Value="0"/>
                <Setter Property="Height" Value="0"/>
            </Style>
        </chartingToolkit:Chart.LegendStyle>
    </chartingToolkit:Chart>

Code-Behind:

        //highestWeightedEvents is a DataTable
        highestWeightedEvents = BuildHighestWeightedEventsTable();
        MainSeries.DependentValueBinding = new Binding("Cutset_Frequency");
        MainSeries.IndependentValueBinding = new Binding("Event_Number");
        MainSeries.ItemsSource = highestWeightedEvents.DefaultView;

Since I define the DataSeries.ItemsSource in the code-behind, the ToolTip binding knows where to look. I hope somebody else can possibly benefit from this as I spent a whole day figuring this out :D

Sign up to request clarification or add additional context in comments.

Comments

0

In code behind you cannot edit a style on the fly cause style get sealed when it's loaded. So you can create a new style from the one you create in the xaml and add your tooltip binding. Something like

//your code behind
        Style newDataPointStyle = (Style)Resources["SimpleDataPointStyle"];

        newDataPointStyle.Setters.Add(
            new Setter
            {
                Property = "ToolTip",
                Value = new Binding("YourBinding")
            });
        MainSeries.DataPointStyle = newDataPointStyle;

1 Comment

I attempted to do this, but it would not work. The first argument for the Setter constructor is of type DependencyProperty and was not liking the string. I also tried redefining the "Property = 'ToolTip'" to "Property = DependencyProperty.Register('ToolTip', typeof(ToolTip), typeof(BarDataPoint))" and was getting an InvalidOperationException at runtime. Thanks though.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.