Я думаю, что неправильно использую шаблон асинхронного ожидания и не знаю, как это исправить.Я основал свой код на некоторых учебных пособиях по множественному освещению.
По сути, я подключаюсь к БД с помощью EF и пытаюсь отобразить данные, привязывая мою ObservableCollection к представлению.
Я начинаю с получения своих данныхИз текста данных что-то вроде этого:
public interface ICountryData
{
Task<List<Country>> GetAllAsync();
}
public class SqlCountryData : ICountryData
{
private NodeDBContext _context;
public SqlCountryData(NodeDBContext context)
{
_context = context;
}
public async Task<List<Country>> GetAllAsync()
{
return await _context.Countries.Include(i => i.AvailableDocuments).OrderBy(c => c.CountryName).ToListAsync();
}
}
Затем вызовите метод GetAllAsync:
public async Task LoadAsync()
{
List<Country> countries = await _countryData.GetAllAsync();
Countries.Clear();
foreach (Country s in countries)
{
Countries.Add(s);
}
}
Я также вставляю все элементы в мою коллекцию ObservebleCollection с помощью цикла foreach.
public ObservableCollection<Country> Countries { get; set; }
Что, в свою очередь, связано в моей Viewmodel
<telerik:RadGridView x:Name="Countries"
GroupRenderMode="Flat"
RowIndicatorVisibility="Collapsed"
CanUserFreezeColumns="False"
ItemsSource="{Binding Countries}"
SelectedItem="{Binding SelectedCountries}"
ShowSearchPanel="True" />
Все это прекрасно загружается.Но он останавливает интерфейс до тех пор, пока это не будет сделано.
--- Изменить, чтобы добавить код, показывающий, как вызывается LoadAsync ---
MainWindowViewModel _viewModel;
public MainWindow(MainWindowViewModel viewModel)
{
InitializeComponent();
_viewModel = viewModel;
DataContext = _viewModel;
Loaded += MainWindow_LoadedAsync;
}
private async void MainWindow_LoadedAsync(object sender, RoutedEventArgs e)
{
await _viewModel.LoadAsync();
}
Внутри модели представления MainWindow:
public async Task LoadAsync()
{
await LookupViewModel.LoadAsync();
}