1

我有一个 C# 类,它同时包含一个 ObservableCollection 和一个包含 ObservableCollection 对象的数组。对象数组中的值是根据第一个基本集合中的值计算的。BindableBase 只是实现了 INotifyPropertyChanged。

我在下面尽可能地简化了我的实现。

RawDS 拥有一个 RawData 的 ObservableCollection,它还拥有一个由 10 个 CalcDS 对象组成的数组,这些对象是 CalcData 的 ObservableCollections。

所有这一切都很好。我有工作线程来累积传入的数据,计算结果并用计算的数据填充数组。我的问题是将所有这些数据绑定到 WPF 中的单个图表和网格。我已经研究、阅读并尝试了所有我能找到的东西,但似乎无法让数据绑定与 RawData 和 CalcData 对象中的属性一起工作。我相信问题源于我绑定到的对象不是 ObservableCollection 而是其中包含 ObservableCollections 的对象。所以我的问题是两折。

  1. 有没有办法做这种数据绑定?我一直在将 DataChart 和 DataGrid 的 DataContext 设置为基础对象 RawDS 并尝试将所有内容与 DataBindings 源和路径属性结合起来。没有欢乐!

  2. 如果不是,那么重构以下数据类的好方法是什么?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]; } }
}
4

2 回答 2

0

我相信可能的工作是将您的数组包装在一个自定义容器中,该容器实现INotifyCollectionChanged然后订阅每个项目的PropertyChanged事件(当添加到集合时,并在删除/处置时取消订阅)并引发CollectionChanged事件。

如果没有其他人很好地尝试解决方案,我可能有时间看看它。

于 2012-11-30T00:02:28.073 回答
0

问题是数组没有实现 INotifyPropertyChanged,因此 UI 不知道数据正在发生变化。Steve Py 有一个包装它的好主意。

如果您可以将其从数组更改为 ObservableCollection 将使事情变得更容易。

于 2012-11-30T02:05:29.497 回答