如何刷新WPF DataGrid?

时间:2009-05-30 19:01:13

标签: wpf data-binding datagrid

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

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

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

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

7 个答案:

答案 0 :(得分:64)

答案 1 :(得分:20)

它没有更新的原因是LINQ-to-SQL没有实现INotifyCollectionChanged,因此WPF无法告诉ItemsSource已经更新。解决此问题的最不可靠的方法是将LINQ-to-SQL结果复制到ObservableCollection - 当您执行Insert时,还要添加到observable集合。然后你会看到更新。

答案 2 :(得分: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);
    }
}

答案 3 :(得分:2)

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

答案 4 :(得分:1)

如果您需要在另一个窗口中重新加载网格,则可以关闭该窗口并再次调用它。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

出于某种原因,Items.Refresh()对我不起作用。 我的工作是使我的基础集合继承ObservableCollection然后调用其Add方法。

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

ContactUIObjects只是基础集合的网格。