2009-07-10 6 views
14

Какое событие срабатывает при обновлении источника DataGrid? Я пробовал DataContextChanged и SourceUpdated, но он никогда не работал.WPF DataGrid как получить при обновлении ItemsSource

На самом деле мне нужна простая вещь. Я хочу, если появится новая строка, прокрутите полосу прокрутки GridView вниз, чтобы посмотреть, что это было.

+0

Когда вы говорите «когда новые строки приходят» вы имеете в виду, чтобы базовый источник данных (база данных) или источник данных DataGrid? –

+0

Я имел в виду, что элемент Items GridView. – Agzam

ответ

27

У меня была такая же проблема, и мне удается это так

DataGrid myGrid = new DataGrid(); 
CollectionView myCollectionView = (CollectionView)CollectionViewSource.GetDefaultView(myGrid.Items); 
((INotifyCollectionChanged)myCollectionView).CollectionChanged += new NotifyCollectionChangedEventHandler(DataGrid_CollectionChanged); 

Затем нужно реализовать логику в обработчик событий DataGrid_CollectionChanged.

3

Если вы пытаетесь обновить сетку, когда что-то добавляется к самой базе данных, этого не произойдет. Я больше знаком с WinForms, чем с WPF, но я предполагаю, что нет волшебного способа сохранить сетку в синхронизации с базой данных без написания фонового процесса, который постоянно проверяет изменения базы данных.

Если вы обновляете фактический источник данных сетки (например, Collection), то это обновит сетку.

+0

Да У меня есть коллекция, и она привязана к GridView через ItemsSource. – Agzam

+0

На самом деле, одним из преимуществ WPF над WinForms является способность привязать сетку к набору данных и обновить пользовательский интерфейс автоматически –

7

Set NotifyOnTargetUpdated = true для привязки ItemsSource и обработки объекта TargetUpdated. Если у вас несколько привязок, тогда найдите свойство DataTransferEventArgs, чтобы узнать, является ли целевой объект ItemsSource или нет.

2

Со своей стороны я использовал уведомление SelectionChange которые поднимают каждое событие Del/Добавить/Редактировать/Выбрать Это работает очень хорошо

private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    Console.WriteLine("hi"); 
}