Можете ли вы привязать несколько LineSeries к oxyplot в WPF, используя шаблон MVVM?

Я пытаюсь построить несколько элементов LineSeries в одном элементе <oxy:PlotView /> в WPF, используя С# в Oxyplot, где я использую шаблон MVVM. Скажем, у меня есть (гипотетическая) ситуация, когда я отслеживаю автомобили с положением как функцией времени. Скажем, у меня есть следующие файлы:

  • Model
    • Car.cs
  • View
    • DisplayView.xaml
    • DisplayView.xaml.cs
  • ViewModel
    • DisplayViewModel.cs

При инициализации я создаю три элемента автомобиля (в DisplayViewModel.cs : Cars = new List<Car>{ new Car(), ...};) с соответствующими данными о смещении и времени PlotData = new List<DataPoint>{ new DataPoint(0,1), new DataPoint(1,4), ...}; и CarName.

DisplayView.xaml (1):

<ListBox ItemsSource="{Binding Path=Cars}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <oxy:Plot Title="{Binding CarName}" Height="400" Width="500">
                    <oxy:Plot.Series>
                        <oxy:LineSeries ItemsSource="{Binding Path=PlotData}"/>
                    </oxy:Plot.Series>
                </oxy:Plot>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Это работает, как и ожидалось. Он показывает <ListBox /> с тремя (отдельными) графиками. Однако это не то, чего я пытаюсь достичь. Я хотел бы сделать что-то вроде следующего:

DisplayView.xaml (2):

<ItemsControl ItemsSource="{Binding Path=Cars}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=CarName}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Это отображает три отдельных названия автомобилей, как и ожидалось, поэтому я знаю, что источник данных подключен правильно. Однако обертывание этого элемента <ItemsControl>...</ItemsControl> элементом <oxy:Plot><oxy:Plot.Series>...</oxy:Plot.Series></oxy:Plot> и изменение элемента <TextBlock /> на элемент <oxy:LineSeries /> и привязка его свойства ItemsSource к ранее упомянутому полю DataPoint приводит к ошибкам A value of type 'ItemsControl' cannot be added to a collection or dictionary of type 'collection`1'. и The specified value cannot be assigned to the collection. The following type was expected: "Series"..

DisplayView.xaml (не работает):

<oxy:Plot Title="Displacement plot">
    <oxy:Plot.Series>
        <ItemsControl ItemsSource="{Binding Path=Cars}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <oxy:LineSeries ItemsSource="{Binding Path=PlotData}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </oxy:Plot.Series>
</oxy:Plot>

Я новичок в шаблоне MVVM - и в программировании на C # и WPF в целом - и я вижу, что файл кода программной части DisplayView.xaml.cs должен быть пустым. Я могу заставить три LineSeries отображаться на одном графике при использовании кода позади, но я пытаюсь использовать возможности MVVM. Кто-нибудь может подсказать, как мне следует это исправить? Я просто недостаточно опытен (пока), чтобы поиграть с кодом, поэтому некоторые пояснения будут оценены. Какие файлы мне нужно добавить, какие методы мне нужно создать и где их создать? Возможно ли это вообще, как я себе это представляю?

С уважением,

Том


person Tom    schedule 23.11.2019    source источник


Ответы (1)


Я думаю, что понял концепцию (после того, как записал свои мысли и вопросы в этом посте), поэтому я отвечаю на свой вопрос. В DisplayView.xaml я добавил <PlotView /> как таковой: <oxy:PlotView x:Name="DisplayPlotView" Model="{Binding PlotModel}" />. Я также создал PlotModel в DisplayViewModel.cs, что, насколько я понимаю, соответствует шаблону MVVM. Я перебираю Cars, чтобы добавить разные серии, выполнив:

foreach(Car car in Cars)
    {
        PlotModel.Series.Add(car.PlotData);
    }

Где я сейчас сделал PlotData LineSeries в Car.cs. Это показывает три линии на одном графике.

person Tom    schedule 23.11.2019