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

Как поднять событие при изменении DataGrid.ItemsSource

Я новичок в WPF, и я работаю с DataGrids, и мне нужно знать, когда изменяется свойство ItemsSource.

Например, мне понадобится, когда при выполнении этой команды событие должно поднять:

dataGrid.ItemsSource = table.DefaultView;

Или когда добавлена ​​строка.

Я попытался использовать этот код:

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

Но этот код работает только тогда, когда пользователь добавляет новую строку в коллекцию. Поэтому мне нужно событие, которое возникает, когда все свойство ItemsSource имеет какое-либо изменение, либо потому, что вся коллекция заменена, либо потому, что добавлена ​​одна строка.

Надеюсь, ты поможешь мне. Заранее благодарю

4b9b3361

Ответ 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();
        }
    }
}