我有一个 C# 类,它同时包含一个 ObservableCollection 和一个包含 ObservableCollection 对象的数组。对象数组中的值是根据第一个基本集合中的值计算的。BindableBase 只是实现了 INotifyPropertyChanged。
我在下面尽可能地简化了我的实现。
RawDS 拥有一个 RawData 的 ObservableCollection,它还拥有一个由 10 个 CalcDS 对象组成的数组,这些对象是 CalcData 的 ObservableCollections。
所有这一切都很好。我有工作线程来累积传入的数据,计算结果并用计算的数据填充数组。我的问题是将所有这些数据绑定到 WPF 中的单个图表和网格。我已经研究、阅读并尝试了所有我能找到的东西,但似乎无法让数据绑定与 RawData 和 CalcData 对象中的属性一起工作。我相信问题源于我绑定到的对象不是 ObservableCollection 而是其中包含 ObservableCollections 的对象。所以我的问题是两折。
有没有办法做这种数据绑定?我一直在将 DataChart 和 DataGrid 的 DataContext 设置为基础对象 RawDS 并尝试将所有内容与 DataBindings 源和路径属性结合起来。没有欢乐!
如果不是,那么重构以下数据类的好方法是什么?CalcData 类现在有 14 个属性(乘以 10),我能想到的一切最终都变成了一个大的整体类。这将是一场维护噩梦。
提前感谢您的帮助。
public class CalcData : BindableBase
{
private Single _plotValue1;
public Single PlotValue1
{
get { return _plotValue1; }
set { SetProperty(ref _plotValue1, value); }
}
}
public class CalcDS : ObservableCollection<CalcData>
{
public CalcDS()
{
var random = new Random();
for (var i = 0; i < 25; i++)
{
var cd = new CalcData
{
PlotValue1 = random.Next(10, 50)
};
Add(cd);
}
}
}
public class RawData : BindableBase
{
private DateTime _xDateTime;
private Single _plotValue;
public DateTime XDateTime
{
get { return _xDateTime; }
set { SetProperty(ref _xDateTime, value); }
}
public Single PlotValue
{
get { return _plotValue; }
set { SetProperty(ref _plotValue, value); }
}
}
public class RawDS : BindableBase
{
private readonly ObservableCollection<RawData> _rawMDP = new ObservableCollection<RawData>();
private readonly CalcDS [] _calcDsDataAry = new CalcDS [10];
// Initialize things and get the worker thread going.
public RawDS()
{
var random = new Random();
var times = new DateTime(2012, 1, 1);
for (var i = 0; i < 25; i++)
{
var time = new TimeSpan(0, random.Next(0, 5), 0);
times = times.Add(time);
var rd = new RawData
{
XDateTime = times,
PlotValue = random.Next(10, 50)
};
_rawMDP.Add(rd);
}
// Create 10 CalcDS objests numbered 0 to 9
for (var cnt = 0; cnt < 10; cnt++)
_calcDsDataAry[cnt] = new CalcDS();
}
public ObservableCollection<RawData> RawMDP
{ get { return _rawMDP; } }
public CalcDS CalcDsData01
{ get { return _calcDsDataAry[0]; } }
public CalcDS CalcDsData02
{ get { return _calcDsDataAry[1]; } }
public CalcDS CalcDsData03
{ get { return _calcDsDataAry[2]; } }
public CalcDS CalcDsData04
{ get { return _calcDsDataAry[3]; } }
public CalcDS CalcDsData05
{ get { return _calcDsDataAry[4]; } }
public CalcDS CalcDsData06
{ get { return _calcDsDataAry[5]; } }
public CalcDS CalcDsData07
{ get { return _calcDsDataAry[6]; } }
public CalcDS CalcDsData08
{ get { return _calcDsDataAry[7]; } }
public CalcDS CalcDsData09
{ get { return _calcDsDataAry[8]; } }
public CalcDS CalcDsData10
{ get { return _calcDsDataAry[9]; } }
}