Как поднять событие при изменении DataGrid.ItemsSource
Я новичок в WPF, и я работаю с DataGrids, и мне нужно знать, когда изменяется свойство ItemsSource.
Например, мне понадобится, когда при выполнении этой команды событие должно поднять:
dataGrid.ItemsSource = table.DefaultView;
Или когда добавлена строка.
Я попытался использовать этот код:
CollectionView myCollectionView = (CollectionView)CollectionViewSource.GetDefaultView(myGrid.Items);
((INotifyCollectionChanged)myCollectionView).CollectionChanged += new NotifyCollectionChangedEventHandler(DataGrid_CollectionChanged);
Но этот код работает только тогда, когда пользователь добавляет новую строку в коллекцию. Поэтому мне нужно событие, которое возникает, когда все свойство ItemsSource имеет какое-либо изменение, либо потому, что вся коллекция заменена, либо потому, что добавлена одна строка.
Надеюсь, ты поможешь мне. Заранее благодарю
Ответы
Ответ 1
ItemsSource
- свойство зависимостей, поэтому достаточно легко получить уведомление, когда свойство изменено на другое. Вы бы хотели использовать это в дополнение к коду, который у вас есть, а не вместо:
В Window.Loaded
(или аналогичном) вы можете подписаться так:
var dpd = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, typeof(DataGrid));
if (dpd != null)
{
dpd.AddValueChanged(myGrid, ThisIsCalledWhenPropertyIsChanged);
}
И у меня есть обработчик изменений:
private void ThisIsCalledWhenPropertyIsChanged(object sender, EventArgs e)
{
}
Всякий раз, когда задано свойство ItemsSource
, вызывается метод ThisIsCalledWhenPropertyIsChanged
.
Вы можете использовать это для любого свойства зависимостей, о котором вы хотите получать уведомления об изменениях.
Ответ 2
Помогает ли это?
public class MyDataGrid : DataGrid
{
protected override void OnItemsSourceChanged(
IEnumerable oldValue, IEnumerable newValue)
{
base.OnItemsSourceChanged(oldValue, newValue);
// do something here?
}
protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e)
{
base.OnItemsChanged(e);
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
break;
case NotifyCollectionChangedAction.Remove:
break;
case NotifyCollectionChangedAction.Replace:
break;
case NotifyCollectionChangedAction.Move:
break;
case NotifyCollectionChangedAction.Reset:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
Ответ 3
Если вы обнаружите новую добавленную строку, можете попробовать DataGrid InitializingNewItem
или AddingNewItem
Event.
InitializingNewItem
Использование:
Datagrid автоматически добавляет элемент с данными родителя