WhenAny和ToProperty

时间:2015-10-09 19:45:26

标签: c# system.reactive reactiveui

我想我错过了一个基本的Observable概念。

我有一个ChargeViewModel类,它有一个ReactiveList属性,它是它自己的集合 ChargeViewModel.Charges包含相关费用

我想观察费用集合中的最新条目(它有一个ChargeViewModel.lastModified),并且在UI中还有基于最新条目的其他属性。

在ctor中我有这个代码用于初始化值;但是当可观察变量" last"时,它不会更新latestActionDate,latestBillToName,lastestNote的值。变化

如果用户更新" last"我希望用户界面更新收取或创建一个新的"最后"。

var last = Charges?
             .Changed
             .Select(_ => Charges.OrderByDescending(c => c.Model.LastModified).FirstOrDefault())
             .StartWith(Charges.OrderByDescending(c =>c.Model.LastModified).FirstOrDefault());

last
  .Select(c => c.Model.LastModified)
  .ToProperty(this, vm => vm.LatestActionDate, out latestActionDate);
last
  .Select(c => c.Model.BillToName)
  .ToProperty(this, vm => vm.LatestBillToName, out latestBillToName);
last
   .Select(c => c.Model.Note)
   .ToProperty(this, vm => vm.LatestNote, out latestNote);

1 个答案:

答案 0 :(得分:2)

ReactiveList(默认情况下)仅通知添加/移动/删除的元素,而不会更改内容。通过设置ChangeTrackingEnabled=true可以相当简单地启用它(也许你已经这样做了。)

但是,启用后,您会在ItemChanged可观察的,而不是Changed上收到此类动机,所以在您的情况下您可能需要这样做:

Charges.Changed.Select(_ => Unit.Default).Merge(Charges.ItemChanged.Select(_ => Unit.Default))
    .Select(_ => /* ... */)
    ....