C#中监听List<T>中成员值的变化
请问C#中如何实现在List<T>中成员的值发生变化的时候,触发一个事件? c# List<T>
[解决办法]
你可以用BindingList<T>,前提是这个T必须实现INotifyPropertyChanged接口。
T必须实现INotifyPropertyChanged接口
INotifyPropertyChanged是为了实现当List<T>或ObservableCollection<T>中的值变化时,能实时在UI显示,我的问题就是,当他通知UI说值已经变化的时候,同时通知一下我(或我用什么方法截取到),好让我触发其他的事件?
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace ConsoleApplication1
{
class Program
{
private static ObservableCollection<DataType> List = new ObservableCollection<DataType>();
static void Main(string[] args)
{
List.CollectionChanged += List_CollectionChanged;
List.Add(new DataType { Fa = "aaa", Fb = 1 });
List.Add(new DataType { Fa = "bbb", Fb = 2 });
List.Add(new DataType { Fa = "ccc", Fb = 3 });
List.Add(new DataType { Fa = "ddd", Fb = 4 });
List[3].Fb += 100; //这个对象修改时,可以在方法obj_PropertyChanged中捕获。
Console.ReadKey();
}
static void List_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
var obj = (DataType)e.NewItems[0];
obj.PropertyChanged += obj_PropertyChanged;
}
}
static void obj_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
var obj = (DataType)sender;
Console.WriteLine("Fa={0}, Fb={1}", obj.Fa, obj.Fb);
}
}
public class DataType : INotifyPropertyChanged
{
private string _Fa;
public string Fa
{
get { return _Fa; }
set
{
if (_Fa != value)
{
_Fa = value;
RaisePropertyChangedEvent("Fa");
}
}
}
private int _Fb;
public int Fb
{
get { return _Fb; }
set
{
if (_Fb != value)
{
_Fb = value;
RaisePropertyChangedEvent("Fb");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChangedEvent(string name)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ExtendList
{
public delegate void ListChangedEventHandler<T>(object sender);
public class MyList<T> : List<T>
{
private int _count;
public String Action { get; set; }
private int MCount
{
get { return _count; }
set
{
if (_count != value)
{
_count = this.Count;
DoListChangedEvent();
}
}
}
public event ListChangedEventHandler<T> ListChanged;
private void DoListChangedEvent()
{
if (this.ListChanged != null)
this.ListChanged(this);
}
public new void Add(T t)
{
base.Add(t);
this.Action = "Add";
MCount++;
}
public new void Remove(T t)
{
base.Remove(t);
this.Action = "Remove";
MCount--;
}
}
class Program
{
static void Main(string[] args)
{
MyList<int> mylist = new MyList<int>();
mylist.ListChanged += List_CollectionChanged<int>;
mylist.ListChanged += List_SummaryChanged<int>;
mylist.Add(1);
mylist.Add(2);
mylist.Remove(1);
Console.ReadKey();
}
static void List_CollectionChanged<T>(object sender)
{
Console.Write("{0} an item. Current items: {1} \n", ((MyList<T>)sender).Action, String.Join(" ", (MyList<T>)sender));
}
static void List_SummaryChanged<T>(object sender)
{
Console.Write("*** {0} an item. Current summary: {1} \n", ((MyList<T>)sender).Action, ((MyList<T>)sender).Sum(item => int.Parse(item.ToString())));
}
}
}