c# - 如何使用附加属性绑定 XyDataSeries 的 ObservableCollection
问题描述
我正在使用 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>
解决方案
上面的问题似乎不完整/有一些错误。您提到了一个附加属性,您将其定义为
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 中定义附加属性的方法。按照 MSDN 文档了解如何注册附加属性。
其次,您在 FrameworkPropertyMetadata 中定义默认值new ObservableCollectionXyDataSeries<double, double>
,但这是一个坏主意,因为您将ObservableCollectionXyDataSeries<double, double>
在所有 MoveBlockModifier 实例之间静态共享一个实例。看看在哪里初始化自定义控件的引用类型依赖属性?
最后,它是您要定义的附加属性,但在 XAML 中您没有像附加属性那样使用它。
这部分:
是不正确的。在此处查看附加属性如何在 XAML 中附加。
最后,您绑定MoveBlockModifier.XyFGData
到主窗口中的属性 XYFGData,但 MoveBlockModifier 的 DataContext 可能不是 MainWindow。
我建议重新开始并修复这些错误!
推荐阅读
- javascript - 将 JavaScript 代码链接到 R Shiny 小部件
- javascript - 我如何以数组格式表示这些数据
- python - 将标签的 Tkinter 窗口保存到图像文件
- python - 如何在不创建列表的情况下添加到 python 中的列表
- bash - 将文件的创建日期保存到变量中 - BASH 脚本 - UNIX
- c# - 如何在剃须刀组件中显示计算机名称
- sqlite - 如果 A 为空,则在 A 列上进行内部连接,然后在 B 列上连接,如果 B 为空,则在 C 列上连接
- arduino - 使用 PlatformIO (Arduino) 从内部振荡器运行 STM32F103?
- typescript - 为什么 querySelectorAll('div') 返回 HTMLDivElement 列表但 querySelectorAll('div.className') 返回 TypeScript 中的 Element 列表
- python - 我正在查看列表二中的项目是否是列表一中每个位置数据的三倍