如何刷新 WPF DataGrid?

Posted

技术标签:

【中文标题】如何刷新 WPF DataGrid?【英文标题】:How to refresh a WPF DataGrid? 【发布时间】:2010-10-30 03:26:33 【问题描述】:

我有一个带有一些数据的 WPF DataGrid。您可以通过单独的窗口添加行。 DataContext 是相同的,一个 LINQ-to-SQL 对象。绑定也是一样,我把ItemsSource属性绑定到一个表上。

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

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

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

【问题讨论】:

【参考方案1】:

它不更新的原因是LINQ-to-SQL 没有实现INotifyCollectionChanged,所以WPF 无法判断ItemsSource 已经更新。解决此问题的最不可怕的方法是将您的 LINQ-to-SQL 结果复制到 ObservableCollection - 当您执行插入时,还添加到可观察集合中。然后你会看到更新。

【讨论】:

您的解决方案显然有效。我只是认为我可以摆脱简单的 XAML 绑定标记。 如果我们使用 ObservableCollection 作为 linq to sql 和控件之间的桥梁,那么我们如何使用 SubmitChanges() 将结果回传到数据库? @MemoryLeak - 所以这是棘手的一点;您不仅想知道 collection 何时更改(即 INotifyCollectionChanged 的​​内容),还想知道任何 items 何时更改。因此,您需要订阅集合更改,然后在添加/删除时,订阅每个项目的 INotifyPropertyChanged。 然后您必须根据收到的通知来决定要保存的内容【参考方案2】:

由于某种原因,Items.Refresh() 不适合我。 起作用的是让我的底层集合继承ObservableCollection,然后调用它的Add 方法。

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

ContactUIObjects 只是网格底层集合。

【讨论】:

【参考方案3】:

我遇到了同样的问题,发现 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);
    

【讨论】:

【参考方案4】:

从这里http://programmer.wrighton.org/2009/01/wpf-datagrid-items-refresh.html尝试 datagrid.Items.Refresh()

【讨论】:

谢谢 :) 我尝试重新绑定相同的源,但它没有更新数据。设置 ItemsSource = null 然后正确的源进行了更新,但导致 SelectionChanged 被触发。 Items.Refresh() 工作完美!【参考方案5】:

如果您必须在另一个窗口中重新加载网格,您可以简单地关闭该窗口并再次调用它。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

您的解决方案与 Pwninstein 的解决方案非常相似。不幸的是,结果是一样的,因为 DataContextChanged 事件不会使 DataGrid 刷新。

以上是关于如何刷新 WPF DataGrid?的主要内容,如果未能解决你的问题,请参考以下文章

WPF中的DataGrid怎么刷新数据

如何刷新 WPF DataGrid?

如何让 WPF DataGrid 单元格右对齐而不使新行上的可选区域变小?

wpf中,当DataGrid.ItemsSource与ObservableCollection绑定后,值变化时,DataGrid如何刷新?

以编程方式为 DataGrid 创建 WPF DataGridTemplateColumn

WPF中的DataGrid 数据动态刷新UI