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 文档非常简单明了。
在更改的事件中,您有属性 NewItems
和 OldItems
(以及其他属性),其中包含集合中新添加或删除的对象。现在这些是一个简单的 IList
(不要与 IList<T>
混淆)所以你必须做一些转换。正如我们所知,集合是一个字符串,我们希望 NewItems
或 OldItems
集合包含字符串值。
现在这些属性 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));
}
}
我刚刚学习 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 文档非常简单明了。
在更改的事件中,您有属性 NewItems
和 OldItems
(以及其他属性),其中包含集合中新添加或删除的对象。现在这些是一个简单的 IList
(不要与 IList<T>
混淆)所以你必须做一些转换。正如我们所知,集合是一个字符串,我们希望 NewItems
或 OldItems
集合包含字符串值。
现在这些属性 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));
}
}