首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#中监听List<T>中成员值的变更

2013-09-30 
C#中监听ListT中成员值的变化请问C#中如何实现在ListT中成员的值发生变化的时候,触发一个事件?c#List

C#中监听List<T>中成员值的变化
请问C#中如何实现在List<T>中成员的值发生变化的时候,触发一个事件? c# List<T>
[解决办法]

引用:
Quote: 引用:

WPF,则用5楼dongxinxi朋友建议的ObservableCollection<T>。


用ObservableCollection<T>也是同样的问题,
在注册的时候可以监听PropertyChanged,但是如何监听这个集合对象内部成员值的变化?
当内部成员值变化时,他会实时通知界面(我用List<T>也实现了),但我用什么方法可以截取到值变化了?以便我触发其他事件?
设置UpdateSourceTrigger为PropertyChanged,也不会响应啊,
PropertyChangedCallback和CoerceValueCallback都没有相应


可以自定义一个事件,比如event EventHandler ItemTextChanged
给那些要监视的
textBox.TextChanged += (obj, evt) =>
{    
    if(this.ItemTextChanged != null) this.ItemTextChanged(textBox, EventArgs.Empty);
}
当它们任何一个Text变化了都会触发ItemTextChanged,若需要其他参数自己重新定义事件参数类
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

你可以用BindingList<T>,前提是这个T必须实现INotifyPropertyChanged接口。


T必须实现INotifyPropertyChanged接口



INotifyPropertyChanged是为了实现当List<T>或ObservableCollection<T>中的值变化时,能实时在UI显示,我的问题就是,当他通知UI说值已经变化的时候,同时通知一下我(或我用什么方法截取到),好让我触发其他的事件?


INotifyPropertyChanged
接口里面有事件的啊 你怎么实现的接口。。。。。
仔细看下接口的定义代码吧 呵呵
[解决办法]
给你写个demo:
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())));
        }
    }
}

热点排行