2009-05-30 60 views
21

我有一些WPF DataGrid数据。您可以通过单独的窗口添加行。 DataContext是相同的,一个LINQ到SQL的对象。绑定也是一样的,我将“ItemsSource”属性绑定到一个表。如何刷新WPF DataGrid?

在另一个窗口中,当用户点击“保存”时,我以编程方式创建一个行并使用“InsertOnSubmit”添加它。之后,我使用DataContext的“SubmitChanges”方法。

我的问题是DataGrid没有更新。如果我重新启动应用程序,我可以看到新行,所以它在数据库中,但我找不到刷新DataGrid的方法。

到目前为止,我试图在DataGrid的BindingExpression上使用“UpdateTarget”,但它没有帮助。我也尝试过“dataGrid.Items.Refresh()” - 相同的结果。我怎样才能解决这个问题?

回答

20

它没有更新的原因是,LINQ到SQL没有实现INotifyCollectionChanged,所以WPF无法告诉ItemsSource已被更新。解决这个问题的最不可思议的方法是,将您的LINQ-to-SQL结果复制到ObservableCollection中 - 当您执行Insert操作时,也将其添加到可观察集合中。然后你会看到更新。

+0

您的解决方案显然工作。我只是认为我可以用简单的XAML绑定标记离开。 – KovBal 2009-06-02 19:20:45

+0

如果我们使用ObservableCollection作为linq到sql与控件之间的桥梁,那么我们如何使用SubmitChanges()将结果回发到数据库? – MemoryLeak 2010-07-27 10:36:56

+3

@MemoryLeak - 所以这是棘手的一点;您不仅希望知道* collection *更改的时间(即INotifyCollectionChanged),还希望知道任何*项*的更改时间。因此,您需要订阅收藏更改,然后添加/删除,订阅每个项目的INotifyPropertyChanged。 *然后*您必须根据您收到的通知来决定保存什么 – 2010-07-27 22:08:20

2

问题是你需要刷新你的LINQ到SQL的DataContext。即使在提交更改后,DataContext也不会正确识别新行。您需要处置您拥有的DataContext并创建一个新的。在大多数情况下,DataContext应该用于一个简短的操作,而不是一个长期存在的对象。

0

或者只是再次调用搜索代码(通常是搜索按钮)>我已经解决了它在我这种情况下。

1

如果您遇到需要在另一个窗口中重新加载网格的情况,可以简单地关闭该窗口并再次调用它。

4

我遇到了同样的问题,发现了的ObservableCollection最好的地方是DataContext的。它有一些由设计师生成的可用于更新集合的部分方法。此代码工作得很好:

partial class DataClassesDataContext 
{ 
    private ObservableCollection<Task> taskCollection; 
    public ReadOnlyObservableCollection<Task> TaskView { get; private set; } 

    partial void OnCreated() 
    { 
     taskCollection = new ObservableCollection<Task>(Tasks); 
     TaskView = new ReadOnlyObservableCollection<Task>(taskCollection); 
    } 

    partial void InsertTask(Task instance) 
    { 
     taskCollection.Add(instance); 
     this.ExecuteDynamicInsert(instance); 
    } 

    partial void DeleteTask(Task instance) 
    { 
     taskCollection.Remove(instance); 
     this.ExecuteDynamicDelete(instance); 
    } 
} 
0

由于某种原因Items.Refresh()不适用于我。 做了什么工作是使我的基础集合继承ObservableCollection,然后调用它的Add方法。

((ContactUIObjects)dgrdContacts.ItemsSource).Add(new ContactUIObject(o)); 

ContactUIObjects只是网格的基础集合。