WPF数据网格不会自动刷新实体框架

时间:2013-03-11 03:15:25

标签: c# wpf entity-framework

我是WPF的新手。现在,我正在编写一个带有Entity Framework的WPF项目。我可以在我的wpf上正确添加和删除项目;但是,在我添加或删除项目后,我的数据网格仍然没有刷新。即使我使用ssEntities.SaveChanges(); ssEntities.Refresh(RefreshMode.StoreWins, ssEntities.User);

如何使用刷新功能或其他功能自动刷新数据网格?

XAML

<Window.Resources>
    <CollectionViewSource x:Key="UserViewSource" 
                          d:DesignSource="{d:DesignInstance my:User, CreateList=True}" />
</Window.Resources>
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="537"  
          HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="12,12,0,0" 
          Name="UserDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" 
          VerticalAlignment="Top" Width="300" 
          SelectedCellsChanged="UserDataGrid_SelectedCellsChanged">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="IDColumn" Binding="{Binding Path=ID}" Header="ID"
                            Width="80" IsReadOnly="True" />
        <DataGridTextColumn x:Name="NameColumn" Binding="{Binding Path=Name}" 
                            Header="Name" Width="80" IsReadOnly="True" />
    </DataGrid.Columns>
</DataGrid>

CS

 private void btnSave_Click(object sender, RoutedEventArgs e)
 {
     try
     {
         if (ActionHandler == "Add")
         {
             User user = new User();   
             user.ID = ID;
             user.Name = Name;

             ssEntities.User.AddObject(user);
         }

         ssEntities.SaveChanges();
         ssEntities.Refresh(RefreshMode.StoreWins, ssEntities.User);
     }
     catch (Exception ex)
     { MessageBox.Show(ex.Message); }
 }

2 个答案:

答案 0 :(得分:0)

我同意在其他答案中评论的其他人,你真的应该采用MVVM来做这样的事情。

那就是说,你上面说过你的DataContext是StudyEntities ssEntities;。那是你的ObjectContext吗?看起来它被用作一个。我通常不使用CollectionViewSource,除非我需要对大量数据集进行自定义过滤和/或排序。否则我只使用ObservableCollection。

这样的事情应该足够了:

private ObservableCollection<User> MyUsers { get; set; }
private StudyEntities ssEntities;

public MyMainWindow()
{
    ssEntities = new StudyEntities();
    MyUsers = new ObservableCollection<User>(ssEntities.Users.ToList());
}

private void btnSave_Click(object sender, RoutedEventArgs e)
{
    //Code for creating the User isntance MyUser
    MyUsers.Add(MyUser);
    ssEntities.Users.Add(MyUser);
    ssEntities.SaveChanges();
}

您的实体被放置在ObservableCollection中,以便可以为UI操作它们。单击该按钮时,它会创建一个用户,将其添加到ObservableCollection和ObjectContext,然后保存更改。为保存更改时将填充为记录生成的ID。

答案 1 :(得分:-1)

假设您正在使用通用List,您需要更改绑定中的UpdateSourceTrigger,并绑定特定元素(示例listUser)

在您的DataGrid中,更改:

ItemsSource="{Binding}" 

要:

ItemsSource="{Binding listUser, UpdateSourceTrigger=PropertyChanged}" 

然后在你的代码中,实现INotifyPropertyChanged,然后执行

OnPropertyChanged("listUser");

属性变更来源:http://msdn.microsoft.com/en-us/library/ms743695.aspx