我只是在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));
}
}
}
答案 0 :(得分:1)
Observable Collection,The Collection Changed和The Event Args文档非常简单。
在更改的事件中,您拥有属性NewItems
和OldItems
(以及其他),其中包含集合中新添加或删除的对象。现在这些是一个简单的IList
(不要与IList<T>
混淆)所以你必须做一些演员。我们知道集合是一个字符串,我们希望NewItems
或OldItems
集合包含字符串值。
如果这些属性不适用,那么这些属性为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));
}
}