Как обновить WPF DataGrid?
У меня есть DataGrid WPF с некоторыми данными. Вы можете добавлять строки через отдельное окно. DataContext тот же, объект LINQ-to-SQL. Связывание также одно и то же, я привязываю свойство ItemsSource к таблице.
В другом окне, когда пользователь нажимает "Сохранить", я создаю строку программно и добавляю ее с помощью "InsertOnSubmit". После этого я использую метод DataContext "SubmitChanges".
Моя проблема в том, что DataGrid не обновляется. Если я перезапущу приложение, я могу увидеть новую строку, так что это в базе данных, но я не смог найти способ обновить DataGrid.
До сих пор я пытался использовать "UpdateTarget" в BindingExpression DataGrid, но это не помогло. Я также попробовал "dataGrid.Items.Refresh()" - тот же результат. Как я могу это исправить?
Ответы
Ответ 1
Причина, по которой он не обновляется, заключается в том, что LINQ-to-SQL не реализует INotifyCollectionChanged, поэтому WPF не может сказать, что ItemsSource обновлен. Наименее устрашающий способ исправить это - скопировать результаты LINQ-to-SQL в ObservableCollection - когда вы вставляете Insert, также добавляете в наблюдаемую коллекцию. Затем вы увидите обновление.
Ответ 2
попробуйте datagrid.Items.Refresh() отсюда http://programmer.wrighton.org/2009/01/wpf-datagrid-items-refresh.html
Ответ 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
- это только базовая коллекция сеток.