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));