实体框架Context.Set <t>()。调用LoadAsync后,Local不会与Datagrid同步

时间:2015-07-14 15:50:34

标签: c# wpf entity-framework asynchronous datagrid

实体框架本地属性是一个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;
}
  1. 如果我先按下“加载”按钮,它会按预期运行(将所有项目加载到集合中并将它们反映到数据网格中)

  2. 如果我先按下LoadAsync按钮,只有一个项目被加载到本地项目(这是另一个问题,为什么只有一个项目),但它没有反映到datagrid中,我可以按SetDataSource来查看。< / p>

  3. 每次按下LoadAsync时,只有一个项目被添加到上一组!!

  4. 如果我按下LoadAsync然后加载错误就会出现并说出&#34;一个ItemsControl与其商品来源不一致&#34;

  5. 现在我的问题是,如何正确使用LoadAsync和Local项目? 如果我无法使用LoadAsync方法从数据库加载项目,那么它的用途是什么?

1 个答案:

答案 0 :(得分:1)

问题是ItemsSource正在与控件的线程不同的线程上更新。如果您使用的是.NET 4.5,则可以使用EnableCollectionSynchronization来允许多个线程访问集合。

有关示例,请参阅this answer