Как обновить WPF DataGrid? - PullRequest
25 голосов
/ 30 мая 2009

У меня есть WPF DataGrid с некоторыми данными. Вы можете добавлять строки через отдельное окно. DataContext - это то же самое, объект LINQ-to-SQL. Привязка также та же, я привязываю свойство ItemsSource к таблице.

В другом окне, когда пользователь нажимает «Сохранить», я создаю строку программным способом и добавляю ее, используя «InsertOnSubmit». После этого я использую метод SubmitChanges DataContext.

Моя проблема в том, что DataGrid не обновляется. Если я перезапускаю приложение, я вижу новую строку, поэтому она находится в базе данных, но я не могу найти способ обновить DataGrid.

До сих пор я пытался использовать «UpdateTarget» для BindingExpression DataGrid, но это не помогло. Я также пытался "dataGrid.Items.Refresh ()" - тот же результат. Как я могу это исправить?

Ответы [ 7 ]

65 голосов
/ 26 января 2011

попробуйте datagrid.Items.Refresh () отсюда http://programmer.wrighton.org/2009/01/wpf-datagrid-items-refresh.html

20 голосов
/ 01 июня 2009

Причина, по которой он не обновляется, заключается в том, что LINQ-to-SQL не реализует INotifyCollectionChanged, поэтому WPF не может сказать, что ItemsSource обновлен. Наименее страшный способ исправить это - скопировать результаты LINQ-to-SQL в ObservableCollection - когда вы делаете вставку, также добавляете в наблюдаемую коллекцию. Тогда вы увидите обновление.

4 голосов
/ 21 марта 2011

Я столкнулся с той же проблемой и обнаружил, что лучшим местом для 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 голосов
/ 01 июня 2009

Проблема в том, что вам нужно обновить свой LINQ-to-SQL DataContext. DataContext не сможет правильно распознать новую строку даже после изменения отправки. Вам нужно избавиться от имеющегося у вас DataContext и создать новый. В большинстве случаев DataContext следует использовать для одной короткой операции, а не в качестве длительного объекта.

1 голос
/ 15 ноября 2010

Если у вас есть случай, когда вам нужно перезагрузить сетку в другое окно, вы можете просто закрыть это окно и снова вызвать его.

0 голосов
/ 13 октября 2011

Почему-то Items.Refresh() у меня не работает. Что работало, так это чтобы моя базовая коллекция наследовала ObservableCollection и затем вызывала ее Add метод.

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

ContactUIObjects - это просто сетка, лежащая в основе коллекции.

0 голосов
/ 08 декабря 2009

Или просто снова введите код поиска (обычно это кнопка поиска)> Я решил это в моем случае следующим образом.

...