Перебор элементов DynamicData SourceCache, не уведомляющих об обновлениях - PullRequest
0 голосов
/ 07 ноября 2019

Я использую DynamicData SourceCache Events в моей модели.

У меня есть ViewModel, Connects для SourceCache и Binds элементы для ReadOnlyObservableCollection<EventViewModel>, например, так:

EventSuite.Events
          .Connect()
          .AutoRefresh()
          .Transform(e => new EventViewModel(e))
          .ObserveOn(RxApp.MainThreadScheduler)
          .Bind(out _items)
          .DisposeMany()
          .Subscribe();

Я использую эту наблюдаемую коллекцию в своем представлении и вв какой-то момент я перебираю SourceCache в моей модели следующим образом (я также пытался использовать foreach для циклического перебора элементов):

for (int i=0; i < Events.Items.Count(); i++)
{
   var @event = Events.Items.ElementAt(i);
   @event.StartedAt = DateTime.UtcNow;
   @event.State = await @event.RunAsync() ? "Passed" : "Failed";
   @event.FinishedAt = DateTime.UtcNow;
   await manager.ManufactureService.SaveJobItemEvent(JobID, JobItemID, @event)
}

EventViewModel имеет следующее свойство, используемое для обновления статуса событияиндикатор в представлении при изменении Event.State:

private ObservableAsPropertyHelper<bool> _passed;
public bool Passed => _passed.Value;

public EventViewModel(
    _passed = this.WhenAnyValue(
                x => x.State,
                (state) => String.Equals(state, "passed", StringComparison.OrdinalIgnoreCase))
                .ObserveOn(RxApp.MainThreadScheduler)
                .Select(x => x)
                .ToProperty(this, x => x.Passed, scheduler: RxApp.MainThreadScheduler);
)

Но представление никогда не обновляется. Существует ли правильный способ перебора SourceCache.Items, чтобы при обновлении / изменении элементов изменения распространялись.

Примечание: я попытался добавить следующую строку в конец цикла, который работално вместо обновления события существующее событие было удалено, а обновленное событие было добавлено в конец списка, что было отражено в представлении.

Events.AddOrUpdate(@event);
...