2013-11-22 1 views
2

Я использую RadChart из Telerik в WPF, и у меня есть проблема, когда я хочу указать MaxValue, MinValue и Step для дополнительной оси Y.Невозможно использовать привязки для дополнительной оси Y в Telerik

Он отлично работает, если я жёстко значения, как это (соответствующая часть последних четырех строк):

<Controls:AxisY MinorTicksVisibility="Hidden" 
    DefaultLabelFormat="#VAL{#,##0}" 
    Title="{UI:Language @{xCubicMetrePerHourSymbol}}" 
    MajorGridLinesVisibility="Hidden" StripLinesVisibility="Visible" 
    AxisName="CubicMetreAxis" 
    AutoRange="False" 
    MaxValue="10000" 
    MinValue="0" 
    Step="0"> 

Но так как я хочу, чтобы изменить MinValue, MaxValue и шаг в зависимости от значений в серии, я должен связать его таким образом, используя свойства из объекта ViewModel (который должен быть моим унаследовали DataContext):

<Controls:AxisY MinorTicksVisibility="Hidden" 
    DefaultLabelFormat="#VAL{#,##0}" 
    Title="{UI:Language @{xCubicMetrePerHourSymbol}}" 
    MajorGridLinesVisibility="Hidden" StripLinesVisibility="Visible" 
    AxisName="CubicMetreAxis" 
    AutoRange="False" 
    MaxValue="{Binding Path=MyMaxValue}" 
    MinValue="{Binding Path=MyMinValue}" 
    Step="{Binding Path=MyStep}"> 

Но мне кажется, что DataContext нельзя увидеть/установить с дополнительной Y-оси из того, что я собрал, используя Snoop.

я получаю следующее сообщение об ошибке (такое же сообщение для каждого из привязок):

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or 
FrameworkContentElement for target element. BindingExpression:Path=MyMaxValue; 
DataItem=null; target element is 'AxisY' (HashCode=47300984); target property is 
'MaxValue' (type 'Double') 

Я думал, что сделал ошибку где-то и искал в течение нескольких часов, но я обнаружил, что-то странное: если я используйте эти привязки в «оригинальной» оси Y, все работает отлично. Код для обеих осей точно такой же. Единственное отличие заключается в родительских элементах.

Это работает:

<Controls:ChartArea.AxisY> 
    <Controls:AxisY MinorTicksVisibility="Hidden" 
        DefaultLabelFormat="#VAL{#,##0}" 
        Title="{UI:Language @{GigaJoulePerHourSymbol}}" 
        MajorGridLinesVisibility="Hidden" 
        StripLinesVisibility="Visible" 
        AutoRange="False" 
        MaxValue="{Binding Path=MyMaxValue}" 
        MinValue="{Binding Path=MyMinValue}" 
        Step="{Binding Path=MyStep}"> 
     <Controls:AxisY.AxisStyles> 
      <Controls:AxisStyles TitleStyle="{StaticResource TranslatedAxisStyle}" /> 
     </Controls:AxisY.AxisStyles> 
    </Controls:AxisY> 
</Controls:ChartArea.AxisY> 

Это не:

<Controls:ChartArea.AdditionalYAxes> 
    <Controls:AxisY MinorTicksVisibility="Hidden" 
        DefaultLabelFormat="#VAL{#,##0}" 
        Title="{UI:Language @{xCubicMetrePerHourSymbol}}" 
        MajorGridLinesVisibility="Hidden" 
        StripLinesVisibility="Visible" 
        AxisName="CubicMetrePerHourAxis" 
        AutoRange="False" 
        MaxValue="{Binding Path=MyMaxValue}" 
        MinValue="{Binding Path=MyMinValue}" 
        Step="{Binding Path=MyStep}"> 
     <Controls:AxisY.AxisStyles> 
      <Controls:AxisStyles TitleStyle="{StaticResource TranslatedAxisStyle}" /> 
     </Controls:AxisY.AxisStyles> 
    </Controls:AxisY> 
</Controls:ChartArea.AdditionalYAxes> 

Сам элемент точно так же, за исключением того, что второй из них имеет имя и название отличается, но я тестируется, и на самом деле это ничего не влияет. Единственное отличие состоит в том, что родительские элементы разные.

Я хотел бы знать, почему AxisY видит DataContext и может правильно связать в то время как AdditionalYAxis не может.

+0

Возможно (я предполагаю), потому что 'AdditionalYAxes' не находится в визуальном дереве. Посмотрите, можете ли вы применить один из стандартных обходных решений, например: http://stackoverflow.com/a/5647426/1001985 – McGarnagle

+0

@McGarnagle Это работает! Большое спасибо, я бы никогда не узнал, как это сделать. Отправьте это как ответ, если вы хотите, чтобы я принял его. –

ответ

1

Поскольку AdditionalYAxis предположительно не находится в visual tree, он не будет наследовать его родительский элемент логического дерева DataContext. Это объясняет, почему привязка не работает нормально. Вы можете использовать обходной путь, подобный описанному here («шпион контекста данных»), чтобы корректно работать с привязкой.

Смежные вопросы