WPF: повышение события, когда элемент добавлен в ListView

Я работаю над WPF, и я использую ListView, и мне нужно запустить событие, когда элемент добавлен к нему. Я пробовал это:

var dependencyPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, typeof(ListView));
        if (dependencyPropertyDescriptor != null)
        {
               dependencyPropertyDescriptor.AddValueChanged(this, ItemsSourcePropertyChangedCallback);
        }

.....

 private void ItemsSourcePropertyChangedCallback(object sender, EventArgs e)
    {
         RaiseItemsSourcePropertyChangedEvent();
    }

Но, похоже, он работает только после изменения всей коллекции, я прочитал это сообщение: event-fired-when-item-is-added-to-listview, но лучший ответ применим только для listBox, Я попытался изменить код на ListView, но я не смог это сделать.

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

Ответ 1

Обратите внимание, что это работает только для WPF Listview!

После некоторых исследований я нашел ответ на свой вопрос, и это очень легко:

public MyControl()
{
    InitializeComponent();
    ((INotifyCollectionChanged)listView.Items).CollectionChanged +=  ListView_CollectionChanged;
}

private void ListView_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)     
{
    if (e.Action == NotifyCollectionChangedAction.Add)
    {
      // scroll the new item into view   
      listView.ScrollIntoView(e.NewItems[0]);
    }
}

На самом деле, перечисление NotifyCollectionChangedAction позволяет вашей программе сообщать вам о любых изменениях, таких как: Добавить, Переместить, Заменить, Удалить и Reset.

Ответ 2

Примечание. Это решение предназначено для WinForms ListView.

В моем случае я оказался на развилке на дороге с двумя вариантами...

(1) Создайте собственный элемент управления ListView, который наследует класс ListView. Затем добавьте новое событие для поднятия, когда какой-либо элемент будет добавлен, удален или ListView очищен. Этот путь казался действительно грязным и длинным. Не говоря уже о другой большой проблеме, которая мне понадобится, чтобы заменить все мои исходные ListViews новым созданным элементом управления Custom ListView. Поэтому я передал это!


(2) При каждом добавлении, удалении или очистке вызова в listview я также вызывал другую функцию, имитирующую событие CollectionChanged.

Создать новое событие, подобное функции...

private void myListViewControl_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    //The projects ListView has been changed
    switch (e.Action)
    {
        case NotifyCollectionChangedAction.Add:
            MessageBox.Show("An Item Has Been Added To The ListView!");
            break;
        case NotifyCollectionChangedAction.Reset:
            MessageBox.Show("The ListView Has Been Cleared!");
            break;
    }
}

Добавить элемент в ListView в другом месте...

ListViewItem lvi = new ListViewItem("ListViewItem 1");
lvi.SubItems.Add("My Subitem 1");
myListViewControl.Items.Add(lvi);
myListViewControl_CollectionChanged(myListViewControl, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, lvi, lvi.Index));

Очистить ListView в другом месте...

myListViewControl.Items.Clear();
myListViewControl_CollectionChanged(myListViewControl, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));