В программе есть постраничный вывод данных из БД в DataGrid.
Данные подгружаются асинхронно порциями при смене номера текущей страницы.
Сейчас сделано так, что в сеттере CurrentPage вызывается LoadProducts, но т.к. нельзя написать await, то метод выполняется синхронно.
Какой такое должно реализовываться?
public int CurrentPage
{
get { return _currentPage; }
set
{
_currentPage = value;
LoadProducts();
OnPropertyChanged();
}
}
async void LoadProducts()
{
// Получение данных из БД
}
Ответ
Никак.
Свойство является по существу полем с небольшой довеской. При использовании поля никто не предполагает, что оно будет медленным, асинхронным, или хуже того сможет зависнуть или бросить исключение (если только не присваивать неправильное значение).
Используйте обыкновенную async-функцию:
public int CurrentPage
{
get { return _currentPage; }
}
public async Task SwitchToPage(int value)
{
// Получение данных из БД
_currentPage = value;
OnPropertyChanged(nameof(CurrentPage));
}
Если речь идёт об интерфейсе, тогда, возможно, имеет смысл такое изменение:
public int CurrentPage
{
get { return _currentPage; }
set
{
if (_currentPage == value) return;
_currentPage = value;
SwitchToPage(value); // игнорируем возвращаемое значение
OnPropertyChanged(); // загрузка произойдёт в фоне
}
}
async Task SwitchToPage(int value)
{
try
{
IsCurrentPageEditable = false;
// Получение данных из БД
}
catch (тут исключения)
{
// тут обработка
}
finally
{
IsCurrentPageEditable = true;
}
}
bool _isCurrentPageEditable = true;
public bool IsCurrentPageEditable
{
get { return _isCurrentPageEditable; }
private set { _isCurrentPageEditable = value; OnPropertyChanged(); }
}
и в UI
Комментариев нет:
Отправить комментарий