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

しかし、コレクション全体が変更された場合にのみ機能するようです。コードを ListView に変更しようとしましたが、できませんでした。

あなたが私を助けてくれることを願っています。前もって感謝します。

4

2 に答える 2

64

これは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列挙型を使用すると、プログラムは、追加、移動、置換、削除、リセットなどの変更について通知することができます。

于 2012-06-04T16:35:04.497 に答える
-2

注: このソリューションは、WinForms ListView を対象としています。

私の場合、2つの選択肢がある道の分岐点にたどり着きました...

(1) ListView のクラスを継承するカスタム ListView コントロールを作成します。次に、アイテムが追加、削除、または ListView がクリアされたときに発生する新しいイベントを追加します。この道は本当に厄介で長く見えました。元のすべての ListViews を新しく作成した Custom 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;
    }
}

別の場所で 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 に答える