Framework - Avalonia.
У меня есть прошивка сущности и репозиторий с асинхронным < / / Код> Функция, которая загружает данные и может занять много времени: < /p>
Код: Выделить всё
namespace DynamicDataWithGui.Models;
public class Firmware
{
public Guid Id { get; set; }
public string Name { get; set; }
}
public class Repository
{
private readonly CompositeDisposable _subscription = new();
private ISourceCache _internalCache;
public IObservableCache LoadInitialData()
{
return ObservableChangeSet.Create(cache =>
{
var d = GetListAsync()
.ToObservable()
.Select(l =>
{
cache.Edit(edit => edit.AddOrUpdate(l));
_internalCache = cache;
return l;
})
.Subscribe()
.DisposeWith(_subscription);
return d;
}, t => t.Id)
.AsObservableCache();
}
private async Task GetListAsync()
{
var result = new List();
for (int i = 0; i < 10; i++)
{
result.Add(new Firmware { Id = Guid.NewGuid(), Name = $"Firmware {i + 1}" });
}
await Task.Delay(5000);
return result;
}
}
Код: Выделить всё
namespace DynamicDataWithGui.ViewModels;
public class FirmwareViewModel: ViewModelBase
{
[Reactive] public string Id { get; set; }
[Reactive] public string Name { get; set; }
public FirmwareViewModel(Firmware firmware)
{
Id = firmware.Id.ToString();
Name = firmware.Name;
}
}
public class ArticleViewModel: ViewModelBase
{
private readonly CompositeDisposable _disposables = new();
[Reactive] public string Name { get; set; }
[Reactive] public bool IsLoading { get; set; }
public ObservableCollectionExtended FirmwareChildren { get; private set; } = new();
public ArticleViewModel()
{
var repository = new Repository();
var dummyFirmwareViewModel =
new FirmwareViewModel( new Firmware{ Id = Guid.Empty, Name = string.Empty });
FirmwareChildren.Add(dummyFirmwareViewModel);
this.WhenAnyValue(vm => vm.IsExpanded)
.Where(isExpanded => isExpanded)
.Select(b =>
{
if (FirmwareChildren.Contains(dummyFirmwareViewModel))
{
IsLoading = true;
FirmwareChildren.Remove(dummyFirmwareViewModel);
repository.LoadInitialData()
.Connect()
.Transform(firmware => new FirmwareViewModel(firmware))
.ObserveOn(RxApp.MainThreadScheduler)
.Bind(FirmwareChildren)
.LastAsync(_ => IsLoading = false)
.Subscribe()
.DisposeWith(_disposables);
}
else
{
FirmwareChildren.Remove(dummyFirmwareViewModel);
}
return b;
})
.Subscribe()
.DisposeWith(_disposables);
}
}
Но я думаю, что я допустил ошибки, особенно в функции LoadInitialData < /code> и мониторинг свойства IseSped. Правильное направление.
Подробнее здесь: https://stackoverflow.com/questions/794 ... -wrong-use
Мобильная версия