WPF и EF с ожиданием асинхронности - PullRequest
0 голосов
/ 14 февраля 2019

Я думаю, что неправильно использую шаблон асинхронного ожидания и не знаю, как это исправить.Я основал свой код на некоторых учебных пособиях по множественному освещению.

По сути, я подключаюсь к БД с помощью 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();
    }
...