我认为我错误地使用了await异步模式,并且不确定如何解决它。我的代码基于一些多视角的教程。
基本上,我使用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);
}
}
我还通过foreach循环将所有项目粘贴到我的ObservebleCollection中。
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" />
所有这些都很好。但是它将冻结UI直到完成。
---编辑以添加一些代码,以显示如何调用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();
}