实体框架本地属性是一个ObservableCollection,可以绑定到一个数据网格。但是它的项目不会通过调用LoadAsync来更新,或者实际更新但不会反映到datagrid中。请考虑以下示例:
XAML
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<Button Content="Load" Click="btnLoad_Click"/>
<Button Content="LoadAsync" Click="btnLoadAsync_Click"/>
<Button Content="SetDataSource" Click="btnSetDataSource_Click"/>
</StackPanel>
<DataGrid Name="grdTest" Grid.Row="1"/>
</Grid>
背后的代码
TestContext db = new TestContext();
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
grdTest.ItemsSource = db.Suppliers.Local;
}
private void btnLoad_Click(object sender, RoutedEventArgs e)
{
var beforQuery = db.Suppliers.Local;
db.Suppliers.Load();
}
private void btnLoadAsync_Click(object sender, RoutedEventArgs e)
{
var beforQuery = db.Suppliers.Local;
db.Suppliers.LoadAsync();
}
private void btnSetDataSource_Click(object sender, RoutedEventArgs e)
{
grdTest.ItemsSource = null;
grdTest.ItemsSource = db.Suppliers.Local;
}
如果我先按下“加载”按钮,它会按预期运行(将所有项目加载到集合中并将它们反映到数据网格中)
如果我先按下LoadAsync按钮,只有一个项目被加载到本地项目(这是另一个问题,为什么只有一个项目),但它没有反映到datagrid中,我可以按SetDataSource来查看。< / p>
每次按下LoadAsync时,只有一个项目被添加到上一组!!
如果我按下LoadAsync然后加载错误就会出现并说出&#34;一个ItemsControl与其商品来源不一致&#34;
现在我的问题是,如何正确使用LoadAsync和Local项目? 如果我无法使用LoadAsync方法从数据库加载项目,那么它的用途是什么?
答案 0 :(得分:1)
问题是ItemsSource
正在与控件的线程不同的线程上更新。如果您使用的是.NET 4.5,则可以使用EnableCollectionSynchronization
来允许多个线程访问集合。
有关示例,请参阅this answer。