Почему FindAncestor не может найти корневой UserControl при вызове внутри элемента {Binding} в DataTemplate? - PullRequest
1 голос
/ 29 марта 2019

Во-первых, извините за заголовок. Рад изменить его на что-то лучшее, если у вас есть предложения.

Я новичок в wpf и не могу обернуться вокруг этой проблемы. У меня есть свойство List <> Serieslist в моем тексте данных UserControl. Пункты в этом списке livecharts SeriesCollection графиков (я думаю, что эта проблема связана с моей некомпетентностью с wpf, а не с livecharts). Я могу найти предка UserControl из StackPanel, но, находясь внутри lvc: CartesianChart with Series = "{Binding}", я не могу.

Мой 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>

Я понимаю, что область действия {Binding} изменяется при входе в CartesianChart, но все же, почему этот способ использования RelativeSource не находит правильный источник для привязки?

Также эти элементы оси живых диаграмм находятся внутри моего живого визуального дерева. [Bars] - это UserControl, и другие пользовательские элементы управления отсутствуют visual tree

Присвоение имени элементу-предку и нахождение текстового контекста с именем кажется несостоятельным для такой простой (?) Проблемы. Также мне может понадобиться повторно использовать эти пользовательские элементы управления, и я бы хотел избежать доступа к родительскому элементу управления name = usercontrol1 name = usercontrol2 name = usercontrol3 и т. Д.

Спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...