OxyPlot中的多个LineSeries绑定

时间:2013-06-19 18:43:41

标签: c# wpf plot oxyplot

是否可以将绘图绑定到LineSeries集合而不是OxyPlot中的单个LineSeries? (而不是通过模型)。

我正在寻找类似的东西:

<oxy:Plot>        
    <oxy:Plot.Series>     
        <oxy:LineSeries ItemsSource="{Binding myCollectionOfLineSeries}" />              
    </oxy:Plot.Series>
</oxy:Plot>

myCollectionOfLineSeries的位置是:

private ObservableCollection<LineSeries> _myCollectionOfLineSeries ;
        public ObservableCollection<LineSeries> myCollectionOfLineSeries 
        {
            get
            {
                return _myCollectionOfLineSeries ;
            }
            set
            {
                _myCollectionOfLineSeries = value;
                OnPropertyChanged("myCollectionOfLineSeries ");

            }
        }

我希望得到答案:a)“不,这是不可能的”或b)“是的,只是把XYZ放在IJK之前”。

感谢阅读。

2 个答案:

答案 0 :(得分:7)

可能有点晚了,但最近我有同样的问题:我需要动态绘制多个系列(基于用户选择的货币的几个收益率曲线)但我不想直接绑定Plot使用PlotModel,因为其他属性(例如Title)需要在我的视图模型中设置为代码而不是XAML标记。

所以我将PlotModel定义为资源,将其绑定到Plot。并在加载视图时查找PlotModel。通过这种方法,我可以通过XAML标记定义可视内容(例如标题,轴,图例等),同时将逻辑放在我的视图模型代码中生成系列。

不确定这是否是一个好方法,但它解决了我的问题。

1)XAML - 定义资源

<UserControl.Resources>
    <oxyPlot:PlotModel 
        x:Key="TestPlotModel"
        Title="XXX Curves (Preview)"
        Subtitle="Scroll mousewheel to zoom; Right-drag to pan"
        LegendPlacement="Outside"
        LegendBorder="{x:Static Member=oxyPlot:OxyColors.Black}"
        >
        <oxyPlot:PlotModel.Axes>
            <axes:LinearAxis 
                Title="Rate (%)" 
                Position="Left" 
                StartPosition="0" 
                StringFormat="#.00000"
                MajorGridlineStyle="Solid"
                MajorGridlineColor="{x:Static Member=oxyPlot:OxyColors.LightGray}"
                MinorGridlineStyle="Dot"
                MinorGridlineColor="{x:Static Member=oxyPlot:OxyColors.LightGray}"
                >
            </axes:LinearAxis>
            <axes:LinearAxis 
                Title="Maturity (Days)" 
                Position="Bottom" 
                StartPosition="0"
                MajorGridlineStyle="Solid"
                MajorGridlineColor="{x:Static Member=oxyPlot:OxyColors.LightGray}"
                >
            </axes:LinearAxis>
        </oxyPlot:PlotModel.Axes>
    </oxyPlot:PlotModel>
</UserControl.Resources>

2)XAML - Plot

<oxy:Plot Grid.Row="1" Model="{Binding Source={StaticResource TestPlotModel}}">
</oxy:Plot>

3)查看模型 - 从视图中获取模型但不绑定

protected override void OnViewLoaded(object view)
{
    base.OnViewLoaded(view);
    this._model = (PlotModel)((XXXView)view).FindResource("TestPlotModel");
}

4)查看模型 - 生成多个系列

_model.Series.Clear();
foreach (var currency in distinctCurrencies)
{
    IEnumerable<DataPoint> dataPoints = ...;

    LineSeries lineSeries = new LineSeries()
    {
        Title = String.Format("*{0}", currency),
        ItemsSource = dataPoints
    };

    _model.Series.Add(lineSeries);
}
希望它有所帮助!

答案 1 :(得分:1)

是的,查看他们的examples,您需要绑定到DataPoint

的集合
public ObservableCollection<DataPoint> MyCollection { ... }

<oxy:Plot.Series>
    <oxy:LineSeries ItemsSource="{Binding MyCollection}" DataFieldX="X" DataFieldY="Y"/>
</oxy:Plot.Series>

Plot type上的Series属性没有设置器:

public Collection<Series> Series
{
    get
    {
        return this.series;
    }
}

您可以绑定到Model属性,该属性是PlotModel类型,其具有带有getter和setter的Series集合属性。有关详细信息,请查看SimpleDemo

<oxy:Plot Model="{Binding MyModel}" ...