我已经生成了一个Datavisualization Line图表,现在我正在尝试构建一个自定义工具提示并且很接近,但还没有完成。这是我对View的相关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个空格,然后做了一个粘贴,但这似乎没有用。
无论如何,我想使用相对来源来引用LineSeries
或Chart
本身,以便在我的MultiFormattingConverter
中,我可以访问{{ 1}}(我的vm)和集合。然后我可以使用“点”中的数据,这是DataContext
让我查找我的TemplatedParent
的所有3个值的数据,并产生一个工具提示,其中包含每个可观察集合的值。无论我在LineSeries
代码中指定了什么,我仍然以“unset”作为值数组中的第一个对象。
上面的代码通过指定我的FindAncestor, AncestorType=
使用一种变体,但它不起作用。我尝试过UserControl
,charting:Chart
,charting:Chart1
,charting:LineSeries
但似乎没有任何对我有用的东西。有人可以帮我弄清楚charting:entrySeries
中指定的内容吗?
答案 0 :(得分:0)
这里的问题是ToolTip
结构不是Chart
可视化树的子项,因此它无法在树上走/走,找到您要查找的内容 - 事实上,如果您使用Snoop或其他一些WPF嗅探工具来查看此内容,您会看到ToolTip
树在您的StackPanel
(或非常接近它)处有效地“结束”
尝试使用ElementName
绑定而不是FindAncestor
,并指定图表/系列元素的名称。这有时可以用来解决这类问题。
另一种方法是创建一种“垫片”,可以从该工具提示中代理回Chart
,但这有点超出了我此刻打入手机的意愿。 :)
答案 1 :(得分:0)
我没有尝试上面建议的ElementName方法。相反,我决定通过使用常规的FormattingConverter来简化,其中传递的值是TemplatedParent - LineDataPoint。现在我使用GetParent(ldp),我有Canvas,它有我的vm作为datacontext。此时,我可以访问我的可观察集合,并可以提取我想要包含在自定义工具提示中的值。 感谢所有海报。