Свяжите DataGrid с коллекцией, которая реализует интерфейс INotifyCollectionChanged . Объекты, которые реализуют этот интерфейс, будут вызывать события, когда их содержимое изменяется, и DataGrid будет прослушивать эти события и соответственно обновляться.
Существует встроенный универсальный класс ObservableCollection , который позаботится обо всем этом для вас. Обычно проще всего его использовать. Тем не менее, у него есть одна ошибка: его можно изменить только из основного потока. Если вам нужно изменить его из другого потока, используйте Dispatcher.Invoke (или BeginInvoke), чтобы избежать получения исключений.
Обратите внимание, что они только уведомляют об изменениях на уровне строк - добавление, удаление, замена целых объектов из коллекции. Чтобы DataGrid также обновлялся при изменении объектов в коллекции, внедрите в них INotifyPropertyChanged .
Я понимаю, что это означает кучу дополнительного кодирования, поскольку вам нужно реализовать классы для перехода между XML и коллекцией, но это предпочтительный вариант. С другой стороны, он должен работать лучше. DataGrid сможет обновлять только те строки, которые ему нужно обновить, а не полностью перерисовывать себя (что может быть дорогой операцией в WPF).