【问题标题】:Xaml oxyplot HighLowSeries Items BindingXaml oxyplot HighLowSeries 项目绑定
【发布时间】:2015-02-09 16:03:42
【问题描述】:

我想通过 XAML 定义一个HighLowSeries。由于HighLowSeries-graphsoxyplot.wpf 命名空间中不可用,我创建了以下类:

public class HighLowSeries : OxyPlot.Wpf.XYAxisSeries
{

    public HighLowSeries()
    {
        this.InternalSeries = new OxyPlot.Series.HighLowSeries();
    }

    public override OxyPlot.Series.Series CreateModel()
    {
        this.SynchronizeProperties(this.InternalSeries);
        return this.InternalSeries;
    }

    /// <summary>
    /// The synchronize properties.
    /// </summary>
    /// <param name="series">
    /// The series.
    /// </param>
    protected override void SynchronizeProperties(OxyPlot.Series.Series series)
    {
        base.SynchronizeProperties(series);
        var s = (OxyPlot.Series.HighLowSeries)series;

        foreach (HighLowItem item in s.Items)
        {
            Trace.WriteLine("HighLowSeries " + item.X);
        }

    }

}

在我的窗口中,我通过以下方式使用HighLowSeries

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Oxy="http://oxyplot.org/wpf"
    xmlns:Tmp="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Oxy:PlotView Width="300"
                    Height="300" 
                    Title="Test">
        <Oxy:PlotView.Series>
            <Tmp:HighLowSeries ItemsSource="{Binding list}" />
        </Oxy:PlotView.Series>
    </Oxy:PlotView>
</Grid>
</Window>

在Window后面的代码中,我有以下代码:

        private IList<HighLowItem> _list;

    public IList<HighLowItem> list
    {
        get
        {
            return this._list;
        }
        set
        {
            this._list = value;
        }
    }

    public MainWindow()
    {
        this.list = new List<HighLowItem>();

        list.Add(new HighLowItem(10, 8, 3, 2, 5));
        list.Add(new HighLowItem(12, 7, 4, 4, 2));
        list.Add(new HighLowItem(18, 4, 1, 2, 3));

        this.DataContext = this;

        InitializeComponent();
    }

当我启动应用程序时,在 (0,0) 处只有一条很小的水平线:

此外,HighLowSeries.SynchronizeProperties() 中还有一个 Trace.WriteLine,我在其中打印出 Items-Collection 中 HighLowElements 的 X 坐标。输出的数量与MainWindow 的列表属性中的元素相匹配。但 X 坐标始终为 0(以及 HighLowElements 的其他属性)。 当我以同样的方式实现自己的LineSeries 时,一切正常。

这是 oxyplot 中的错误吗?还是我错过了什么?目前无法通过代码创建HighLowSeries

【问题讨论】:

    标签: c# wpf xaml binding oxyplot


    【解决方案1】:

    终于找到了位置,DataPoints 的列表被清除了。

    在源代码中(OxyPlot Source HighLowItemSeries)

    有这个方法:

    /// <summary>
    /// Updates the data.
    /// </summary>
    protected internal override void UpdateData()
    {
        if (this.ItemsSource == null)
        {
            return;
        }
    
        this.items.Clear();
    
        // Use the mapping to generate the points
        if (this.Mapping != null)
        {
            foreach (var item in this.ItemsSource)
            {
                this.items.Add(this.Mapping(item));
            }
            return;
        }
    
        var filler = new ListFiller<HighLowItem>();
        filler.Add(this.DataFieldX, (p, v) => p.X = Axis.ToDouble(v));
        filler.Add(this.DataFieldHigh, (p, v) => p.High = Axis.ToDouble(v));
        filler.Add(this.DataFieldLow, (p, v) => p.Low = Axis.ToDouble(v));
        filler.Add(this.DataFieldOpen, (p, v) => p.Open = Axis.ToDouble(v));
        filler.Add(this.DataFieldClose, (p, v) => p.Close = Axis.ToDouble(v));
        filler.FillT(this.items, this.ItemsSource);
    }
    

    由于this.Mapping 等于null,mapping 被绕过并添加filler object

    Mapping-field的评论说如何设置值:

        /// <summary>
        /// Gets or sets the mapping delegate.
        /// </summary>
        /// <value>The mapping.</value>
        /// <remarks>Example: series1.Mapping = item => new HighLowItem(((MyType)item).Time,((MyType)item).Value);</remarks>
        public Func<object, HighLowItem> Mapping { get; set; }
    

    如果我将 SynchronizeProperties 方法更改为以下,一切正常。

        protected override void SynchronizeProperties(OxyPlot.Series.Series series)
        {
            base.SynchronizeProperties(series);
            var s = (OxyPlot.Series.HighLowSeries)series;
            s.Mapping = item => new HighLowItem(((HighLowItem)item).X, ((HighLowItem)item).High, ((HighLowItem)item).Low, ((HighLowItem)item).Open, ((HighLowItem)item).Close);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 2013-09-10
      • 2013-06-16
      • 2016-05-29
      相关资源
      最近更新 更多