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:在列表视图中添加项时引发事件

请注意,

这仅适用于 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));