Проблема
При запуске приложения открывается пустая страница Home
. Я go на вкладке Vendors
, и она зависает на несколько секунд (я вижу, что пользовательский интерфейс заморожен). После этого отображается страница Vendors
. Элементы содержат данные из базы данных.
Можно подумать, что блокировка была вызвана загрузкой данных из базы данных. Но это происходит в async/await
методах.
Если после одного из загруженных из Vendors
вернуться к Home
и обратно к Vendors
- заморозка отсутствует. Страница открывается практически мгновенно. В этом случае также происходит механизм загрузки данных (Loaded event
)
. Оказывается, что остановка происходит только с чистого запуска при первом посещении страницы Vendros
. В чем может быть проблема?
GIF
Код
Просмотр
<i:Interaction.Behaviors>
<ic:EventTriggerBehavior EventName="Loaded">
<ic:InvokeCommandAction Command="{x:Bind ViewModel.PageLoadedCommand}" />
</ic:EventTriggerBehavior>
</i:Interaction.Behaviors>
VendorsViewModel
public ICommand PageLoadedCommand {get;}
private async void OnPageLoaded(RoutedEventArgs args)
{
await VendorsService.InitializeAsync();
BankItems = VendorsService.BankItems;
AuthorityItems = VendorsService.AuthorityItems;
VendorItems = VendorsService.VendorItems;
}
public ObservableCollection<VendorModel> VendorItems {get; set;}
public ObservableCollection<TwoLinesModel> BankItems {get; set;}
public ObservableCollection<TwoLinesModel> AuthorityItems{get; set;}
VendorService
private TwoLinesService<BankEntity> BankService { get; } = new TwoLinesService<BankEntity>();
private TwoLinesService<AuthorityEntity> AuthorityService { get; } = new TwoLinesService<AuthorityEntity>();
public ObservableCollection<VendorModel> VendorItems { get; private set; }
public ObservableCollection<TwoLinesModel> BankItems { get; private set; }
public ObservableCollection<TwoLinesModel> AuthorityItems { get; private set; }
public async Task InitializeAsync()
{
await BankService.InitializeAsync();
await AuthorityService.InitializeAsync();
VendorItems = new ObservableCollection<VendorModel>
{
new VendorModel { Name = "Name 1", Surname = "Surname 1", Patronymic = "MiddleName 1", IssueDate = new DateTime(2020, 2, 9) },
new VendorModel { Name = "Name 2", Surname = "Surname 2", Patronymic = "MiddleName 2", IssueDate = new DateTime(2019, 3, 7) }
};
BankItems = BankService.Items;
AuthorityItems = AuthorityService.Items;
await Task.CompletedTask;
}
TwoLinesService
public class TwoLinesService<TEntity>
where TEntity : TwoLinesEntity, new()
{
private IDataServiceFactory<TEntity> DataServiceFactory { get; } = new DataServiceFactory<TEntity>();
public ObservableCollection<TwoLinesModel> Items { get; } = new ObservableCollection<TwoLinesModel>();
public async Task InitializeAsync()
{
using var dataService = DataServiceFactory.Create();
foreach (var entity in await dataService.SelectAll())
{
Items.Add(CreateModel(entity));
}
await Task.CompletedTask;
}
public TwoLinesModel CreateModel(TEntity source)
{
return new TwoLinesModel
{
ID = source.ID,
Title = source.Title,
Text = source.Text,
CreatedOn = source.CreatedOn,
LastModifiedOn = source.LastModifiedOn
};
}
}
DataServiceFactory
public class DataServiceFactory<T> : IDataServiceFactory<T> where T : DomainEntity
{
public IDataService<T> Create()
{
return Configuraiton.Current.DataProvider switch
{
DataProviderType.SQLite => new SQLiteService<T>(Configuraiton.Current.SQLiteConnectionString),
_ => throw new NotImplementedException()
};
}
}
SelectAll ()
public partial class GenericDataService<T> : IDataService<T> where T : DomainEntity
{
private readonly DbContext _dbContext;
public GenericDataService(DbContext dbContext) => _dbContext = dbContext;
public async Task<IList<T>> SelectAll()
{
return await _dbContext.Set<T>().ToListAsync();
}
}