21

我正在使用 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 但我无法做到这一点。

我希望你能帮助我。先感谢您。

4

2 回答 2

64

请注意,这只适用于 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枚举允许您的程序通知您任何更改,例如:添加、移动、替换、删除和重置。

于 2012-06-04T16:35:04.497 回答
-2

注意:此解决方案适用于 WinForms ListView。

就我而言,我最终走到了岔路口,有两个选择......

(1)创建一个自定义ListView控件,继承一个ListView的类。然后添加一个在添加、删除或清除 ListView 时引发的新事件。这条路看起来真的很乱很长。更不用说我需要用新创建的自定义 ListView 控件替换所有原始 ListViews 的另一个大问题。所以我通过了这个!


(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;
    }
}

将项目添加到其他地方的 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));
于 2013-10-26T17:38:51.157 回答