Подтвердить что ты не робот

Как обновить WPF DataGrid?

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

ContactUIObjects - это только базовая коллекция сеток.