为什么在DataTemplate的{Binding}元素内调用FindAncestor时找不到根UserControl?

时间:2019-03-29 11:55:56

标签: c# wpf

首先,对标题感到抱歉。如果有建议,很高兴将其更改为更好的东西。

我是wpf的新手,无法解决这个问题。我的UserControl数据上下文中有一个属性List <> Serieslist。此列表中的项目是livecharts SeriesCollection图表(我认为此问题与我对wpf的无能而不是与活动图表有关)。我可以从StackPanel中找到UserControl的祖先,但是当进入带有Seri​​es =“ {Binding}”的lvc:CartesianChart时,我找不到。

我的XAML:

<Grid Grid.Column="1">
            <StackPanel >
                <ItemsControl ItemsSource="{Binding Serieslist}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>

                                <!--These Bindings work as intended-->
                                <TextBlock Text="{Binding Path=DataContext.From, Mode=TwoWay, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"/>
                                <TextBlock Text="{Binding Path=DataContext.To, Mode=TwoWay, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"/>


                                <lvc:CartesianChart Height="100" Series="{Binding}" Zoom="X" Grid.Column="0" DisableAnimations="True" DataTooltip="{x:Null}">
                                    <lvc:CartesianChart.AxisX>

                                        <!--These Bindings don't-->
                                        <lvc:Axis LabelFormatter="{Binding Path=DataContext.Formatter, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" 
                                                  MinValue = "{Binding Path=DataContext.From, Mode=TwoWay, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" 
                                                  MaxValue = "{Binding Path=DataContext.To, Mode=TwoWay, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
                                                  RangeChangedCommand="{Binding Path=DataContext.Axis_OnRangeChangedCommand, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"/>
                                    </lvc:CartesianChart.AxisX>
                                    <lvc:CartesianChart.AxisY>
                                        <lvc:Axis Foreground="DodgerBlue" MinValue="0"/>
                                        <lvc:Axis Foreground="IndianRed" Position="RightTop" MinValue="0" MaxValue="10"/>
                                    </lvc:CartesianChart.AxisY>
                                </lvc:CartesianChart>
                            </StackPanel>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>
        </Grid>

我了解进入CartesianChart时{Binding}范围会发生变化,但是为什么这种使用RelativeSource的方法不能找到正确的绑定源?

这些活动图表轴元素也在我的实时视觉树中找到。 [Bars]是UserControl,没有其他UserControls visual tree

为此类简单的(?)问题,命名祖先元素并找到带有名称的datacontext似乎很困难。另外,我可能需要重用这些用户控件,并且我想避免使用name = usercontrol1 name = usercontrol2 name = usercontrol3等访问父控件的方式。

谢谢您的帮助!

0 个答案:

没有答案