Как я могу связать вложенные модели представления со свойствами элемента управления - PullRequest
5 голосов
/ 22 октября 2009

Я использовал Microsoft Chart Control из набора инструментов WPF, чтобы написать свой собственный элемент управления диаграммой. Я писал об этом здесь . Элемент управления My Chart размещает оси в диаграмме друг над другом. Как вы можете прочитать в статье, все это работает довольно хорошо. Теперь я хочу создать модель представления, управляющую данными и осями на графике. Пока что я могу добавлять оси на график и показывать их на графике. Но у меня есть проблема, когда я пытаюсь добавить серию строк, потому что у него есть одно свойство DependentAxis и одно свойство InDependentAxis. Я не знаю, как назначить ему соответствующие элементы управления xAxis и yAxis.
Ниже вы видите часть LineSeriesViewModel. У него есть вложенные свойства XAxisViewModel и YAxisViewModel.

public class LineSeriesViewModel : ViewModelBase, IChartComponent
{

    XAxisViewModel _xAxis;
    public XAxisViewModel XAxis
    {
        get { return _xAxis; }
        set
        {
            _xAxis = value;
            RaisePropertyChanged(() => XAxis);
        }
    }

    //The YAxis Property look the same
}

Все модели представлений имеют собственную таблицу данных. Код xaml выглядит так:

<UserControl.Resources>
    <DataTemplate x:Key="xAxisTemplate" DataType="{x:Type l:YAxisViewModel}">
        <chart:LinearAxis  x:Name="yAxis"  Orientation="Y" Location="Left" Minimum="0"  Maximum="10" IsHitTestVisible="False" Width="50" />
    </DataTemplate>
    <DataTemplate x:Key="yAxisTemplate" DataType="{x:Type l:XAxisViewModel}">
        <chart:LinearAxis x:Name="xAxis"  Orientation="X" Location="Bottom" Minimum="0"  Maximum="100" IsHitTestVisible="False" Height="50" />
    </DataTemplate>

    <DataTemplate DataType="{x:Type l:LineSeriesViewModel}">
        <!--Binding doesn't work on the Dependent and IndependentAxis! -->
        <!--YAxis XAxis and Series are properties of the LineSeriesViewModel -->
        <l:FastLineSeries DependentAxis="{Binding Path=YAxis}" 
                          IndependentAxis="{Binding Path=XAxis}"
                          ItemsSource="{Binding Path=Series}"/>
    </DataTemplate>
    <Style TargetType="ItemsControl">
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <!--My stacked chart control -->
                    <l:StackedPanel x:Name="stackedPanel" Width="Auto" Height="Auto" Background="LightBlue">
                    </l:StackedPanel>
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ClipToBounds="True">
    <!-- View is an ObservableCollection of all axes and series-->
    <ItemsControl x:Name="chartItems" ItemsSource="{Binding Path=View}" Focusable="False">
    </ItemsControl>
</Grid>

Этот код работает довольно хорошо. Когда я добавляю топоры, они рисуются. Но DependentAxis и InDependentAxis элемента управления lineseries остаются нулевыми, поэтому серия не прорисовывается. Как связать вложенные модели представления со свойствами элемента управления?

Ответы [ 2 ]

1 голос
/ 14 апреля 2010

Вы, наверное, уже проверили это, но я обнаружил, что при отладке привязок первое и простое место для запуска - запуск сеанса отладки из VS, поскольку выходные данные отладки сообщают, какие объекты и свойства не могут быть привязаны. Я обычно заканчиваю тем, что обнаружил, что мне нужно явно установить DataContext или что-то еще, например опечатку. Выходные данные для поиска начинаются так:

System.Windows.Data Ошибка: 39: Ошибка пути BindingExpression:

за этим следует имя свойства, к которому вы пытались привязаться, и, как правило, самое главное, класс, с которым он пытается связаться. Если это не помогло, здесь есть отличная статья о привязках отладки: http://www.beacosta.com/blog/?p=52, в которой обсуждается использование PresentationTraceSources.TraceLevel = High, о котором упоминал Алий, а также несколько других приемов. Надеюсь, что это на правильном пути.

С уважением,

Mike

1 голос
/ 07 марта 2010

должно работать. Несколько вещей, которые вы можете проверить:

  • Связывание серии работает? Если это так, попробуйте выяснить, в чем разница.
  • Вы уверены, что свойства XAxis и YAxis действительно имеют значения? Попробуйте поставить точку останова в геттере. Если оно достигнуто, привязка работает. Вы также можете поместить конвертер (IValueConverter) в Binding (который просто возвращает полученное значение) и поместить туда точку останова.
  • Используйте PresentationTraceSources.TraceLevel = High для Binding, чтобы получить более детальную трассировку (которая появится в окне вывода VS).
  • Определены ли DependentAxis / IndependentAxis как свойства зависимостей в FastLineSeries?

Надеюсь, это поможет,

Aelij.

...