gpt4 book ai didi

c# - Reactive Extensions/Reactive UI 观察集合,将其分组并显示

转载 作者:太空狗 更新时间:2023-10-30 00:41:53 25 4
gpt4 key购买 nike

我有一个特定的数据集,需要存储分组和排序的数据。每当任何单个项目发生变化时,每一行都需要能够重新计算它的总和。

这是最终结果的基本外观:

enter image description here

对象结构如下:

public class MyObject : INotifyPropertyChanged
{
public ObservableCollection<MySubObject> Objects { get; set; }
public Decimal TotalOfAll { get; set; }

/* Ommited INPC and other properties for brevity */
}

public class MySubObject : INotifyPropertyChanged
{
public Decimal Value { get; set; }
public String RowType { get; set; }

/* Ommited INPC and other properties for brevity */
}

View 需要绑定(bind)到 MyObject,然后按其 Type 属性对 Objects 属性进行分组。

现在,我已经在不使用响应式扩展的情况下完成了这项工作,但感觉有点老套...我想通过将 MyObject 的 Objects 属性转换为一个可观察对象来完成此操作,理论上,这应该允许我更新每当 MySubObject 的 Value 属性发生变化时求和。

我已经构建了 View 方面的内容,所以这不是问题...它正在完成 RX 部分。

注意:

我也可以这样公开我的数据:

public class MyObject : INotifyPropertyChanged
{
public ObservableCollection<MyRowObject> Objects { get; set; }
public Decimal TotalOfAll { get; set; }

/* Ommited INPC and other properties for brevity */
}

public class MyRowObject : INotifyPropertyChanged
{
public ObservableCollection<MySubObject> Objects { get; set; }
public String RowType { get; set; }
public Decimal RowTotal { get; set; }

/* Ommited INPC and other properties for brevity */
}

public class MySubObject : INotifyPropertyChanged
{
public Decimal Value { get; set; }

/* Ommited INPC and other properties for brevity */
}

这会解决分组问题,但我仍然无法让它工作

最佳答案

您可以使用 ReactiveUI 的响应式集合,它提供了许多可观察值,包括一个用于集合更改时 (Changed),以及一个用于集合中的项目更改时 (ItemChanged)。这可以与依赖属性的 ObservableAsPropertyHelper 结合使用。

totalOfAll 依赖属性非常简单。另一个依赖属性 - groupedObjects - 有点复杂。我不确定我是否完全理解您的分组要求。希望下面的代码将是一个起点 - 它将子对象的集合投影到匿名对象的 IEnumerable 中,每个对象都包含一个总数、一个行标题和项目。你应该能够在你的 View 中绑定(bind)到这个

public class MyObject : ReactiveObject
{
public ReactiveCollection<MySubObject> Objects { get; set; }

private ObservableAsPropertyHelper<IEnumerable<object>> groupedObjectsHelper;
public IEnumerable<object> GroupedObjects
{
get {return groupedObjectsHelper.Value;}
}

private ObservableAsPropertyHelper<Decimal> totalOfAllHelper;
public Decimal TotalOfAll
{
get {return totalOfAllHelper.Value;}
}

public MyObject()
{
var whenObjectsChange=
Observable.Merge(Objects.Changed.Select(_ => Unit.Default),
Objects.ItemChanged.Select(_ => Unit.Default));

totalOfAllHelper=
whenObjectsChange.Select(_=>Objects.Sum(o => o.Value))
.ToProperty(this, t => t.TotalOfAll);

groupedObjectsHelper=
whenObjectsChange.Select(_=>Objects
.GroupBy(o => o.RowType)
.Select(g => new {RowType=g.Key,
RowTotal=g.Sum(o => o.Value),
Objects=g}))
.ToProperty(this, t => t.GroupedObjects);

}
}

关于c# - Reactive Extensions/Reactive UI 观察集合,将其分组并显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18239702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com