未计算嵌套XAML WPF中的绑定
我有一个嵌套的WPF视图,通过依赖属性将对象传递到内层 我的外部XAML层将数据传递到未计算嵌套XAML WPF中的绑定,wpf,xaml,data-binding,livecharts,Wpf,Xaml,Data Binding,Livecharts,我有一个嵌套的WPF视图,通过依赖属性将对象传递到内层 我的外部XAML层将数据传递到RetentionChartControl.ChartParams: 在最内层,我有以下XAML代码: <UserControl x:Class="DryLab.Peakmovement.RetentionChartControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presen
RetentionChartControl.ChartParams
:
在最内层,我有以下XAML代码:
<UserControl x:Class="DryLab.Peakmovement.RetentionChartControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:DryLab.Peakmovement"
xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
mc:Ignorable="d"
x:Name="uc"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<lvc:CartesianChart x:Name="cc" Series="{Binding ChartParams.Seriescollection, RelativeSource={RelativeSource AncestorType={x:Type local:RetentionChartControl}}}" >
<lvc:CartesianChart.DataTooltip>
<lvc:DefaultTooltip SelectionMode="OnlySender" />
</lvc:CartesianChart.DataTooltip>
<lvc:CartesianChart.AxisY>
<lvc:Axis Foreground="Black" Title="{Binding ChartParams.TitleAxY, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:RetentionChartControl}} }" LabelFormatter="{Binding ChartParams.Formatter, RelativeSource={RelativeSource AncestorType={x:Type local:RetentionChartControl}}}">
</lvc:Axis>
</lvc:CartesianChart.AxisY>
<lvc:CartesianChart.AxisX>
<lvc:Axis Foreground="Black" Title="{Binding ChartParams.TitleAxX, RelativeSource={RelativeSource AncestorType={x:Type local:RetentionChartControl}}}" Labels="{Binding ChartParams.Labels, RelativeSource={RelativeSource AncestorType={x:Type local:RetentionChartControl}} }"></lvc:Axis>
</lvc:CartesianChart.AxisX>
</lvc:CartesianChart>
</Grid>
</UserControl>
现在
(来自LiveCharts)的绑定正在工作,ChartParams变量已被完全计算,我可以访问Seriescollection
但是,如果我查看更深层次的嵌套
(通过LiveVisualTree),则永远不会计算Title
属性
我错过了什么?为什么我不能从
中绑定到ChartParams
感谢您的帮助,如有必要,我们将发布更多代码
编辑:
我应该补充一点,当应用程序运行时,我在Xaml中触摸我的
Axis.Title
,它会重新评估结果,然后将结果显示为spected问题是,绑定解决时,Axis
元素没有添加到可视化树中。作为图表底层画布
的子元素的所有可见元素将在以后添加(在引发图表控件的FrameworkElement.Loaded
事件很久之后)。因此,使用RelativeSource
将轴或分隔符等绑定到其可视父对象的数据绑定将不会指向任何地方(除非在相关目标元素添加到画布
后设置绑定(需要C#而不是XAML)通过观察CartesianChart.Content.LayoutUpdated
事件,但我建议不要这样做)
建议的解决方案是绑定到DataContext
您可以将UserControl
本身设置为自己的DataContext
:
PeakrowChartGroupControl.xaml.cs
partial class PeakrowChartGroupControl : UserControl
{
public PeakrowChartGroupControl()
{
InitializeComponent();
this.DataContext = this;
}
}
PeakrowChartGroupControl.xaml
<UserControl x:Class="DryLab.Peakmovement.RetentionChartControl">
<Grid>
<lvc:CartesianChart x:Name="cc" Series="{Binding ChartParams.Seriescollection}">
<lvc:CartesianChart.AxisY>
<lvc:Axis Title="{Binding ChartParams.TitleAxY}"
LabelFormatter="{Binding ChartParams.Formatter}" />
</lvc:CartesianChart.AxisY>
<lvc:CartesianChart.AxisX>
<lvc:Axis Title="{Binding ChartParams.TitleAxX}"
Labels="{Binding ChartParams.Labels}" />
</lvc:CartesianChart.AxisX>
</lvc:CartesianChart>
</Grid>
</UserControl>
<UserControl x:Class="DryLab.Peakmovement.RetentionChartControl">
<Grid>
<lvc:CartesianChart DataContext="{Binding ChartParams, RelativeSource={RelativeSource AncestorType=local:RetentionChartControl}}"
Series="{Binding Seriescollection}">
<lvc:CartesianChart.AxisY>
<lvc:Axis Title="{Binding TitleAxY}"
LabelFormatter="{Binding Formatter}" />
</lvc:CartesianChart.AxisY>
<lvc:CartesianChart.AxisX>
<lvc:Axis Title="{Binding TitleAxX}"
Labels="{Binding Labels}" />
</lvc:CartesianChart.AxisX>
</lvc:CartesianChart>
</Grid>
</UserControl>
感谢Bionic,将我的参数直接传递给
DataContext
就是它所需要的。