如何刷新 WPF DataGrid?

29

我有一个 WPF 的 DataGrid,其中包含一些数据。你可以通过另一个窗口添加行。该 DataContext 是相同的,是一个 LINQ-to-SQL 对象。绑定也是相同的,我将 ItemsSource 属性绑定到一个表上。

在另一个窗口中,当用户点击 Save 后,我会以编程方式创建一个行,并使用 InsertOnSubmit 添加它。之后,我使用 DataContextSubmitChanges 方法。

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

到目前为止,我尝试过在 DataGridBindingExpression 上使用 UpdateTarget,但没有帮助。我还尝试了 dataGrid.Items.Refresh(),但结果相同。我该如何解决这个问题?

7个回答

67

谢谢 :) 我尝试重新绑定相同的源,但它没有更新数据。将ItemsSource设置为null,然后再设置正确的源进行更新,但会触发SelectionChanged事件。使用Items.Refresh()完美解决了问题! - Gertjan

21

更新未生效的原因是 LINQ-to-SQL 没有实现 INotifyCollectionChanged,因此WPF无法知道 ItemsSource 已被更新。修复这个问题最简单的方式是将LINQ-to-SQL结果复制到一个 ObservableCollection 中 - 在执行插入操作时,同时添加到可观察集合中。然后你就可以看到更新了。


你的解决方案显然是有效的。我只是想着我可以使用简单的XAML绑定标记来完成。 - KovBal
如果我们使用ObservableCollection作为linq to sql和控件之间的桥梁,那么我们如何使用SubmitChanges()将结果提交回数据库? - MemoryLeak
3
@MemoryLeak - 这里有一个棘手的问题;你不仅想要知道集合何时更改(即INotifyCollectionChanged),还想知道任何何时更改。因此,你需要订阅集合更改事件,然后在添加/删除后,订阅每个项的INotifyPropertyChanged事件。然后,根据收到的通知来决定保存什么。 - Ana Betts

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);
    }
}

2

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


你的解决方案与Pwninstein的非常相似。不幸的是,由于DataContextChanged事件不会使DataGrid刷新,结果也是一样的。 - KovBal

1

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


0

由于某些原因,Items.Refresh() 对我不起作用。 有效的方法是让我的基础集合继承 ObservableCollection,然后调用其 Add 方法。

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

ContactUIObjects 只是网格的基础集合。


0

或者再次调用搜索代码(通常为搜索按钮)> 我已经在我的代码中解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接