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

时间:2015-06-09 22:13:13

标签: c# event-handling observablecollection

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

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

1 个答案:

答案 0 :(得分:1)

Observable CollectionThe Collection ChangedThe Event Args文档非常简单。

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

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

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