在数据可视化图表行系列中使用relativesource find祖先

本文关键字:relativesource find 祖先 系列 可视化 数据 | 更新日期: 2023-09-27 17:58:19

我已经生成了一个数据可视化折线图,现在我正在尝试构建一个自定义工具提示,并且已经接近尾声,但还没有完全实现。以下是我针对视图的相关XAML(使用MVVM)。

<charting:Chart x:Name="Chart1" Height="Auto" Width="Auto" Title="Profit and Loss"  
            DockPanel.Dock="Bottom"
            PlotAreaStyle="{StaticResource PlotAreaStyle}" 
            MinHeight="200" 
            MinWidth="200" 
            HorizontalAlignment="Stretch" 
            VerticalAlignment="Stretch">
    <charting:Chart.Resources>
        <ControlTemplate x:Key="LineDataPointTemplate" TargetType="charting:LineDataPoint">
            <Grid x:Name="Root" Opacity="1">
                <ToolTipService.ToolTip>
                    <StackPanel>
                        <ContentControl>
                            <ContentControl.Content>
                                <MultiBinding Converter="{StaticResource MultiFormattingConverter}">
                                    <MultiBinding.Bindings>
                                        <Binding  Path="Title" >
                                            <Binding.RelativeSource>
                                                <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" />
                                            </Binding.RelativeSource>
                                        </Binding>
                                        <Binding RelativeSource="{RelativeSource TemplatedParent}"/>
                                    </MultiBinding.Bindings>
                                </MultiBinding>
                            </ContentControl.Content>
                        </ContentControl>
                    </StackPanel>
                </ToolTipService.ToolTip>
            </Grid>
        </ControlTemplate>
    </charting:Chart.Resources>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Loaded">
            <ei:CallMethodAction TargetObject="{Binding}" MethodName="ChartLoadedMethod" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <charting:Chart.Series>
      <charting:LineSeries x:Name="entrySeries" ItemsSource="{Binding EntryDataPointColl}" 
             Title="{Binding entryDateLegend}"
             d:DataContext="EntryDataPointColl.xml"
             IndependentValueBinding="{Binding Path=Xvalue}" 
             FlowDirection="LeftToRight" 
             DependentValueBinding="{Binding Path=Yvalue}" 
             >
        <charting:LineSeries.DataPointStyle>
            <Style TargetType="{x:Type charting:LineDataPoint}">
                <Setter Property="Visibility" Value="Collapsed" />
                <Setter Property="Opacity" Value="0" />
                <Setter Property="Background" Value="DarkGreen" />
                <Setter Property="Template" Value="{StaticResource LineDataPointTemplate}"/>

嗯,我不知道如何输入代码。。。我缩进了4个空格,然后做了一个粘贴,但这似乎不起作用。

无论如何,我想使用相对源引用LineSeriesChart本身,这样在我的MultiFormattingConverter中,我就可以访问DataContext(我的vm)和集合。然后,我可以使用TemplatedParent提供的"点"的数据来查找我的所有3个LineSeries的值,并生成一个工具提示,其中包含每个可观察集合的值。无论我在FindAncestor, AncestorType=代码中指定了什么,我最终仍然将"unset"作为值数组中的第一个对象。

上面的代码通过指定我的UserControl使用了一种变体,但它不起作用。我试过charting:Chartcharting:Chart1charting:LineSeriescharting:entrySeries,但似乎都不适用。有人能帮我弄清楚在FindAncestor中指定什么吗?

在数据可视化图表行系列中使用relativesource find祖先

这里的问题是ToolTip结构不是Chart视觉树的子树,所以它没有办法在树上走上/走下并找到你要找的东西-事实上,如果你用Snoop或其他WPF嗅探工具来查看它,你会发现ToolTip树有效地"结束"在你的StackPanel(或非常接近它)

请尝试使用ElementName绑定而不是FindAncestor,并指定图表/系列元素的名称。这有时可以用来解决这类问题。

另一种方法是创建一种"垫片",可以从该工具提示中代理回Chart,但这有点超出了我目前在手机中打字的意愿。:)

我没有尝试上面建议的ElementName方法。相反,我决定使用一个常规的FormattingConverter来简化,传递的值是TemplatedPrent-LineDataPoint。现在我使用了GetParent(ldp),我有了Canvas,它有我的vm作为它的数据上下文。此时,我可以访问我的可观察集合,并可以提取要包含在自定义工具提示中的值。感谢所有的海报。