C# 在事件 CollectionChanged 上显示 ObservableCollection 的字符串

C# Displaying String of ObservableCollection on event CollectionChanged

我刚刚学习 C# 中的事件,教程中给出了以下示例。我的问题是如何在我的事件处理程序中显示字符串 added/removed 的内容。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SubscribeTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var coll = new ObservableCollection<string>();

            // TODO: subscribe to an event here
            coll.CollectionChanged += coll_CollectionChanged;

            coll.Add("Big Mac");
            coll.Add("Filet 'O Fish");
            coll.Add("Quarter Pounder");
            coll.Add("French Fries");
            coll.Remove("Filet 'O Fish");

            Console.ReadKey(true);
        }

        static void coll_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            //Does not do what I want it to.
            Console.WriteLine(Convert.ToString(e.NewItems));
        }
    }
}

Observable Collection, The Collection Changed and The Event Args 文档非常简单明了。

在更改的事件中,您有属性 NewItemsOldItems(以及其他属性),其中包含集合中新添加或删除的对象。现在这些是一个简单的 IList(不要与 IList<T> 混淆)所以你必须做一些转换。正如我们所知,集合是一个字符串,我们希望 NewItemsOldItems 集合包含字符串值。

现在这些属性 null 如果它们不适用。 IE。在 Add 方法(或 action)中,OldItems 属性 将为空。因此,如果您只想打印更改,请尝试以下操作。

static void coll_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    List<string> items = new List<string>();

    //added items
    if (e.NewItems != null)
        items.AddRange(e.NewItems.OfType<string>());

    ///old items
    if (e.OldItems != null)
        items.AddRange(e.OldItems.OfType<string>());

    Console.WriteLine(string.Join(", ", items));
}

完全更改的代码:同样,这不用担心操作只打印结果。

class Program
{
    static void Main(string[] args)
    {
        var coll = new ObservableCollection<string>();

        // TODO: subscribe to an event here
        coll.CollectionChanged += coll_CollectionChanged;

        coll.Add("Big Mac");
        coll.Add("Filet 'O Fish");
        coll.Add("Quarter Pounder");
        coll.Add("French Fries");
        coll.Remove("Filet 'O Fish");

        Console.ReadKey(true);
    }

    static void coll_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        List<string> items = new List<string>();

        //added items
        if (e.NewItems != null)
            items.AddRange(e.NewItems.OfType<string>());

        ///old items
        if (e.OldItems != null)
            items.AddRange(e.OldItems.OfType<string>());

        Console.WriteLine(string.Join(", ", items));
    }
}