我试图在Oxyplot中使用C#在WPF中的一个LineSeries元素中绘制多个<oxy:PlotView />元素,其中我正在使用MVVM模式。假设我处于(假设的)情况,即我正在跟踪位置随时间变化的汽车。说我有以下文件:

  • 模型
  • Car.cs
  • 查看
  • 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属性绑定(bind)到前面提到的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的功能。有人可以给我有关如何解决此问题的指示吗?我只是还没有足够的经验(尚未)来使用该代码,因此请多加解释。我需要添加哪些文件,需要创建什么方法,以及在哪里创建这些文件?按照我的设想,这是否有可能?

    亲切的问候,

    汤姆

    最佳答案

    我想我掌握了这个概念(在写完这篇文章的想法和问题之后),所以我在回答自己的问题。在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的位置。这在一张图中显示了三行。

    关于c# - 您可以使用MVVM模式将多个LineSeries绑定(bind)到WPF中的氧化图吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59012546/

    10-13 05:08