我正在使用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,但我无法做到这一点。
我希望你能帮助我。提前谢谢。
答案 0 :(得分:48)
请注意,这仅适用于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
枚举允许您的程序通知您任何更改,例如:添加,移动,替换,删除和重置。
答案 1 :(得分:-1)
注意:此解决方案适用于WinForms ListView。
在我的情况下,我最终选择了两个选择来到路上岔路口......
(1)创建一个继承ListView类的自定义ListView控件。然后在添加,删除任何项目或清除ListView时添加要引发的新事件。这条道路似乎非常凌乱而且漫长。更不用说我需要用新创建的Custom ListView控件替换所有原始ListViews的另一个大问题。所以我传了这个!
(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));