WPF:在列表视图中添加项时引发事件
本文关键字:事件 添加 列表 视图 WPF | 更新日期: 2023-09-27 18:36:10
我正在处理 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();
}
但它似乎只有在整个集合更改时才有效,我已经阅读了这篇文章:当项目添加到列表视图时触发的事件,但最佳答案仅适用于列表框。我试图将代码更改为列表视图,但我无法做到这一点。
我希望你能帮助我。提前谢谢你。
请注意,
这仅适用于 WPF 列表视图!
经过一些研究,我找到了问题的答案,这真的很容易:
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
枚举允许您的程序通知您任何更改,例如:添加,移动,替换,删除和重置。
注意:此解决方案适用于 WinForms ListView。
就我而言,我最终来到了一个岔路口,有 2 个选择......
(1) 创建继承列表视图类的自定义列表视图控件。 然后添加一个新事件,以便在添加、删除任何项或清除 ListView 时引发。 这条路看起来真的很乱,很长。 更不用说另一个大问题,我需要将所有原始的 ListView 替换为新创建的自定义列表视图控件。 所以我通过了这个!
(2) 每次添加、删除或清除对列表视图的调用,我还调用了另一个模拟 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;
}
}
将项目添加到列表视图的其他位置...
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));
清除其他位置的列表视图...
myListViewControl.Items.Clear();
myListViewControl_CollectionChanged(myListViewControl, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));