【问题标题】:How to Bind an ObservableCollection of XyDataSeries using an Attached Property如何使用附加属性绑定 XyDataSeries 的 ObservableCollection
【发布时间】:2019-01-16 14:39:26
【问题描述】:

我正在使用 SciChart 创建一个图表应用程序。 我添加了一个图表修改器类,它允许编辑图表数据,但只允许编辑当前显示的数据。我需要扩展这个类,以便可以访问每个 XyDataSeries 的完整 ObservableCollection。

我已经实现了一个附加属性,我可以在 MainWindow DataContext 中绑定到该属性,但是每当我运行应用程序时,该集合在修饰符类中显示为 null。请您给点建议。谢谢

public class MoveBlockModifier : ChartModifierBase
{

    public static readonly DependencyProperty XyFGDataProperty = DependencyProperty.RegisterAttached("XyFGData", typeof(ObservableCollection<XyDataSeries<double,double>>), typeof(MoveBlockModifier), new FrameworkPropertyMetadata(new ObservableCollection<XyDataSeries<double,double>>()));

    public ObservableCollection<XyDataSeries<double, double>> XyFGData
    {
        get { return (ObservableCollection < XyDataSeries<double, double>>)GetValue(XyFGDataProperty); }
        set { SetValue(XyFGDataProperty, value); }
    }

    public MoveBlockModifier()
    {            
        _ghostSeries = new FastLineRenderableSeries()
        {
            Stroke = Colors.Black,
            DataSeries = editingSeries,
            Name = "GhostSeries",                
            StrokeThickness = 1,
            Opacity = 0.75,
        };          

    }

} 

Public Class MainWindow: Window, INotifyPropertyChanged
{
private ObservableCollection<XyDataSeries<double, double>> _xyFGData;
    public ObservableCollection<XyDataSeries<double, double>> XYFGData
    {
        get { return _xyFGData; }
        set { _xyFGData = value; OnPropertyChanged("XYFGData"); }
    }
}

主窗口的 XAML

   <s:SciChartSurface x:Name="Chart2">  
                <s:SciChartSurface.ChartModifier>                        
                        <local:MoveBlockModifier  FixStart="{Binding FixStart}" FixEnd="{Binding FixEnd}" 
                                                  IsEnabled="{Binding ChartTwoMoveBlockEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                    XyFGData="{Binding XYFGData, Mode=TwoWay}" />
                    </s:ModifierGroup>
                </s:SciChartSurface.ChartModifier>
            </s:SciChartSurface>

【问题讨论】:

    标签: c# wpf observablecollection attached-properties scichart


    【解决方案1】:

    上面的问题似乎不完整/有一些错误。您提到了一个附加属性,您将其定义为 this

    public static readonly DependencyProperty XyFGDataProperty = DependencyProperty.RegisterAttached("XyFGData", typeof(ObservableCollection<XyDataSeries<double,double>>), typeof(MoveBlockModifier), new FrameworkPropertyMetadata(new ObservableCollection<XyDataSeries<double,double>>()));
    
        public ObservableCollection<XyDataSeries<double, double>> XyFGData
        {
            get { return (ObservableCollection < XyDataSeries<double, double>>)GetValue(XyFGDataProperty); }
            set { SetValue(XyFGDataProperty, value); }
        }
    ...
    

    但这不是在 WPF 中定义附加属性的方法。遵循 how to register an attached property 的 MSDN 文档。

    其次,您在 FrameworkPropertyMetadata 中定义默认值 new ObservableCollectionXyDataSeries&lt;double, double&gt;,但这是个坏主意,因为您将在所有 MoveBlockModifier 实例之间静态共享一个 ObservableCollectionXyDataSeries&lt;double, double&gt; 实例。看看Where to initialize reference type dependency properties for a custom control?

    最后,它是您要定义的附加属性,但在 XAML 中您并没有像附加属性那样使用它。

    这部分:

    不正确。 See how an attached property is attached in XAML here

    最后,您将MoveBlockModifier.XyFGData 绑定到主窗口中的属性 XYFGData,但 MoveBlockModifier 的 DataContext 可能不是 MainWindow。

    我建议重新开始并修复这些错误!

    【讨论】:

    • 谢谢安德鲁!正如你所看到的,我在依赖/附加属性方面是个新手。我觉得这一切都非常复杂。我对此采取了不同的方法,只是使用了 IRenderableSeries 的 ObservableCollection 来修改来自 MoveBlockModifier 的图表数据。再次感谢您的帮助。
    • 好主意,祝你好运!
    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 2016-09-25
    • 2021-12-01
    • 2019-10-31
    • 2017-07-02
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多