Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未计算嵌套XAML WPF中的绑定_Wpf_Xaml_Data Binding_Livecharts - Fatal编程技术网

未计算嵌套XAML WPF中的绑定

未计算嵌套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

我有一个嵌套的WPF视图,通过依赖属性将对象传递到内层

我的外部XAML层将数据传递到
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
就是它所需要的。